Проверить, существует ли каталог, и создать его при необходимости?
Прямой ответ на этот вопрос заключается в предположении простой ситуации, когда вы не ожидаете, что другие пользователи или процессы будут связываться с вашим каталогом:
if not os.path.exists(d):
os.makedirs(d)
или если создание каталога зависит от условий гонки (т. е. если после проверки пути существует, что-то еще, возможно, уже сделало это), сделайте это:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
Но, возможно, еще лучший подход - обойти проблему конфликта ресурсов, используя временные каталоги с помощью tempfile
:
import tempfile
d = tempfile.mkdtemp()
Вот основные сведения из онлайн-документа:
mkdtemp(suffix='', prefix='tmp', dir=None)
User-callable function to create and return a unique temporary
directory. The return value is the pathname of the directory.
The directory is readable, writable, and searchable only by the
creating user.
Caller is responsible for deleting the directory when done with it.
Новое в Python 3.5: pathlib.Path
сexist_ok
Есть новый Path
объект (начиная с 3.4) с множеством методов, которые можно использовать с путями - один из которых есть mkdir
.
(Для контекста я отслеживаю своего еженедельного представителя с помощью скрипта. Вот соответствующие части кода из скрипта, которые позволяют мне избегать переполнения стека более одного раза в день для одних и тех же данных.)
Сначала соответствующий импорт:
from pathlib import Path
import tempfile
Нам не нужно иметь дело os.path.join
сейчас - просто соедините части пути с помощью /
:
directory = Path(tempfile.gettempdir()) / 'sodata'
Затем я идемпотентно гарантирую, что каталог существует - exist_ok
аргумент обнаруживается в Python 3.5:
directory.mkdir(exist_ok=True)
Вот соответствующая часть документации :
Если exist_ok
это правда, FileExistsError
исключения будут игнорироваться (то же самое поведение, что и POSIX mkdir -p
команда), но только если последний компонент пути не является существующим файлом, не являющимся каталогом.
Вот немного больше сценария - в моем случае я не подвержен условию гонки, у меня есть только один процесс, который ожидает, что каталог (или содержащиеся файлы) будет там, и у меня нет ничего, что пыталось бы удалить каталог.
todays_file = directory / str(datetime.datetime.utcnow().date())
if todays_file.exists():
logger.info("todays_file exists: " + str(todays_file))
df = pd.read_json(str(todays_file))
Path
объекты должны быть приведены к тому, str
чтобы другие API, ожидающие str
пути, могли их использовать.
Возможно, Панды должны быть обновлены, чтобы принимать экземпляры абстрактного базового класса os.PathLike
.