Как я могу безопасно создать вложенный каталог? - PullRequest
3590 голосов
/ 07 ноября 2008

Какой самый элегантный способ проверить, существует ли каталог, в который будет записан файл, и, если нет, создать каталог с помощью Python? Вот что я попробовал:

import os

file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)

try:
    os.stat(directory)
except:
    os.mkdir(directory)       

f = file(filename)

Почему-то я пропустил os.path.exists (спасибо, Канджа, Блэр и Дуглас). Вот что у меня сейчас:

def ensure_dir(file_path):
    directory = os.path.dirname(file_path)
    if not os.path.exists(directory):
        os.makedirs(directory)

Есть ли флаг "open", который делает это автоматически?

Ответы [ 26 ]

4 голосов
/ 11 сентября 2018

Почему бы не использовать модуль подпроцесса, если он работает на компьютере, который поддерживает команду mkdir с опцией -p? Работает на Python 2.7 и Python 3.6

from subprocess import call
call(['mkdir', '-p', 'path1/path2/path3'])

Должен справиться с задачей на большинстве систем.

В ситуациях, когда переносимость не имеет значения (например, с помощью Docker), решение состоит из двух строк. Вам также не нужно добавлять логику, чтобы проверить, существуют ли каталоги или нет. И, наконец, безопасно перезапускать без каких-либо побочных эффектов

Если вам нужна обработка ошибок:

from subprocess import check_call
try:
    check_call(['mkdir', '-p', 'path1/path2/path3'])
except:
    handle...
4 голосов
/ 03 декабря 2016

Если учесть следующее:

os.path.isdir('/tmp/dirname')

означает, что каталог (путь) существует И является каталогом. Так что для меня этот путь делает то, что мне нужно. Поэтому я могу убедиться, что это папка (а не файл) и существует.

3 голосов
/ 28 апреля 2018

Вызовите функцию create_dir() в точке входа вашей программы / проекта.

import os

def create_dir(directory):
    if not os.path.exists(directory):
        print('Creating Directory '+directory)
        os.makedirs(directory)

create_dir('Project directory')
2 голосов
/ 16 апреля 2018

Используйте эту команду check и создайте каталог

 if not os.path.isdir(test_img_dir):
     os.mkdir(test_img_dir)
1 голос
/ 06 июля 2017
import os
if os.path.isfile(filename):
    print "file exists"
else:
    "Your code here"

Где ваш код здесь, используйте (сенсорную) команду

Это проверит, существует ли файл, если его нет, то он создаст его.

0 голосов
/ 19 мая 2019

Вы должны установить полный путь перед созданием каталога:

import os,sys,inspect
import pathlib

currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
your_folder = currentdir + "/" + "your_folder"

if not os.path.exists(your_folder):
   pathlib.Path(your_folder).mkdir(parents=True, exist_ok=True)

Это работает для меня и, надеюсь, это будет работать и для вас

...