Ответ 1
os.makedirs
- это то, что вам нужно. Для chmod
или chown
вам нужно будет использовать os.walk
и использовать его для каждого файла/каталога.
Есть ли метод Python для рекурсивного создания каталогов? У меня есть этот путь:
/home/dail/
Я хотел бы создать
/home/dail/first/second/third
Могу ли я сделать это рекурсивно или мне нужно создать один каталог за другим?
То же самое для:
chmod и chown Я могу сделать это рекурсивно, не назначая разрешения для каждого файла/dir?
os.makedirs
- это то, что вам нужно. Для chmod
или chown
вам нужно будет использовать os.walk
и использовать его для каждого файла/каталога.
Очень старый вопрос, я знаю.
начиная с python 3.2, вы можете сделать это:
import os
path = '/home/dail/first/second/third'
os.makedirs(path, exist_ok=True)
благодаря exist_ok
flag, это даже не будет жаловаться, если каталог существует (в зависимости от ваших потребностей....).
начиная с python 3.4 (который включает модуль pathlib), вы можете сделать это:
from pathlib import Path
path = Path('/home/dail/first/second/third')
path.mkdir(parents=True)
начиная с python 3.5 mkdir
также имеет флаг exist_ok
- установка его на True
не вызовет исключения, если каталог существует:
path.mkdir(parents=True, exist_ok=True)
Вот моя реализация для вашей справки:
def _mkdir_recursive(self, path):
sub_path = os.path.dirname(path)
if not os.path.exists(sub_path):
self._mkdir_recursive(sub_path)
if not os.path.exists(path):
os.mkdir(path)
Надеюсь на эту помощь!
Я согласен с ответом Cat Plus Plus. Однако, если вы знаете, что это будет использоваться только в Unix-подобных операционных системах, вы можете использовать внешние вызовы для команд оболочки mkdir
, chmod
и chown
. Не забудьте передать дополнительные флаги, чтобы рекурсивно повлиять на каталоги:
>>> import subprocess
>>> subprocess.check_output(['mkdir', '-p', 'first/second/third'])
# Equivalent to running 'mkdir -p first/second/third' in a shell (which creates
# parent directories if they do not yet exist).
>>> subprocess.check_output(['chown', '-R', 'dail:users', 'first'])
# Recursively change owner to 'dail' and group to 'users' for 'first' and all of
# its subdirectories.
>>> subprocess.check_output(['chmod', '-R', 'g+w', 'first'])
# Add group write permissions to 'first' and all of its subdirectories.
EDIT Я изначально использовал commands
, что было плохим выбором, поскольку он устарел и уязвим для инъекционных атак. (Например, если пользователь дал ввод для создания каталога с именем first/;rm -rf --no-preserve-root /;
, можно было бы удалить все каталоги).
EDIT 2 Если вы используете Python менее 2,7, используйте check_call
вместо check_output
. Подробнее см. В subprocess
документации.
Попробуйте использовать os.makedirs:
import os
try:
os.makedirs(<path>)
except OSError:
pass