Verifique se existe um diretório e crie-o, se necessário?
A resposta direta a isso é, assumindo uma situação simples em que você não espera que outros usuários ou processos mexam com seu diretório:
if not os.path.exists(d):
os.makedirs(d)
ou se a criação do diretório estiver sujeita às condições de corrida (ou seja, se após a verificação do caminho existir, algo já pode ter sido feito):
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
Mas talvez uma abordagem ainda melhor seja evitar o problema de contenção de recursos usando diretórios temporários por meio de tempfile
:
import tempfile
d = tempfile.mkdtemp()
Aqui está o essencial do documento on-line:
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.
Novo no Python 3.5: pathlib.Path
comexist_ok
Há um novo Path
objeto (a partir do 3.4) com muitos métodos que você gostaria de usar com caminhos - um dos quais é mkdir
.
(Por contexto, estou rastreando meu representante semanal com um script. Aqui estão as partes relevantes do código do script que me permitem evitar atingir o estouro de pilha mais de uma vez por dia para os mesmos dados.)
Primeiro as importações relevantes:
from pathlib import Path
import tempfile
Não precisamos lidar os.path.join
agora - basta juntar as partes do caminho com um /
:
directory = Path(tempfile.gettempdir()) / 'sodata'
Em seguida, garanto que o diretório existe de maneira independente - o exist_ok
argumento aparece no Python 3.5:
directory.mkdir(exist_ok=True)
Aqui está a parte relevante da documentação :
Se exist_ok
for verdade, as FileExistsError
exceções serão ignoradas (o mesmo comportamento do POSIX mkdir -p
comando), mas apenas se o último componente do caminho não for um arquivo não-diretório existente.
Aqui está um pouco mais do script - no meu caso, não estou sujeito a uma condição de corrida, só tenho um processo que espera que o diretório (ou arquivos contidos) esteja lá e não tenho nada tentando remover o diretório.
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
os objetos precisam ser coagidos str
antes que outras APIs que esperam str
caminhos possam usá-los.
Talvez o Pandas deva ser atualizado para aceitar instâncias da classe base abstrata os.PathLike
,.