Перевірте, чи існує каталог, і створіть його при необхідності?
Пряма відповідь на це полягає в припущенні простої ситуації, коли ви не очікуєте, що інші користувачі чи процеси змішаться з вашим каталогом:
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
.