Проверить, существует ли каталог, и создать его при необходимости?
Прямой ответ на этот вопрос в простой ситуации, когда вы не ожидаете, что другие пользователи или процессы будут связываться с вашим каталогом:
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
имеет значение true, исключения 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
, смогут их использовать.
Возможно, Pandas следует обновить, чтобы принимать экземпляры абстрактного базового класса, os.PathLike
.