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