Qual é a maneira mais elegante de verificar se o diretório para o qual um arquivo vai ser escrito existe, e se não existir, criar o diretório usando Python? Aqui está o que eu tentei:
import os
file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)
try:
os.stat(directory)
except:
os.mkdir(directory)
f = file(filename)
De alguma forma, eu perdi o "os.path.exists" (obrigado kanja, Blair, e Douglas). Isto é o que eu tenho agora:
def ensure_dir(file_path):
directory = os.path.dirname(file_path)
if not os.path.exists(directory):
os.makedirs(directory)
Existe uma bandeira para "open" que faz isto acontecer automaticamente?
Vejo duas respostas com boas qualidades, cada uma com uma pequena falha, por isso vou dar a minha opinião:
Tente os.path.exists
, e considere os.makedirs
para a criação.
import os
if not os.path.exists(directory):
os.makedirs(directory)
Como observado nos comentários e em outros lugares, há uma condição de corrida – se o diretório for criado entre o os.path.exists' e as chamadas
os.makedirs', o os.makedirs' falhará com um
OSError'. Infelizmente, o "blanket-catching OSError
e continuando não é infalível, pois irá ignorar uma falha na criação do diretório devido a outros fatores, tais como permissões insuficientes, disco completo, etc.
Uma opção seria capturar o OSError
e examinar o código de erro embutido (veja Existe uma forma cruzada de obter informações do OSError do Python):
import os, errno
try:
os.makedirs(directory)
except OSError as e:
if e.errno != errno.EEXIST:
raise
Alternativamente, poderia haver um segundo `os.path.exists', mas suponha que outro criou o diretório após a primeira verificação, depois o removeu antes do segundo – ainda podemos ser enganados.
Dependendo da aplicação, o perigo de operações simultâneas pode ser maior ou menor do que o perigo representado por outros fatores, tais como permissões de arquivo. O desenvolvedor teria que saber mais sobre a aplicação em particular que está sendo desenvolvida e seu ambiente esperado antes de escolher uma implementação.
As versões modernas do Python melhoram bastante este código, tanto ao expor FileExistsError
(em 3.3+)...
try:
os.makedirs("path/to/directory")
except FileExistsError:
# directory already exists
pass
...e permitindo um argumento de palavra-chave para os.makedirs
chamado exist_ok
(em 3.2+).
os.makedirs("path/to/directory", exist_ok=True) # succeeds even if directory exists.
Verifique os.makedirs
: (Certifica-se que o caminho completo existe).
Para lidar com o fato de que o diretório pode existir, pegue OSError
.
(Se exist_ok
for False
(o padrão), um OSError
é levantado se o diretório de destino já existir).
import os
try:
os.makedirs('./path/to/somewhere')
except OSError:
pass
Tente a função o.caminho.existe'.
if not os.path.exists(dir):
os.mkdir(dir)