Uma palavra de aviso - a resposta mais alta pode ser suscetível às condições da corrida. Você pode querer executar os.stat, para ver se o diretório existe e é um diretório no mesmo momento.
d33tah
1
@ d33tah Você pode ter um bom argumento, mas não vejo uma maneira os.statde dizer o diretório de um arquivo. Aumenta OSErrorquando o caminho é inválido, não importa se é um arquivo ou diretório. Além disso, qualquer código após a verificação também é suscetível a condições de corrida.
Tomáš Zato - Restabelecer Monica
4
@ TomášZato: o que leva à conclusão de que é seguro apenas executar a operação e lidar com erros.
precisa saber é o seguinte
2
@ David542 Adicionei um caso de esclarecimento com testes de precisão para "isdir" "existe". Eu acho que você aprenderia qualquer coisa agora. Mas isso poderia iluminar novas pessoas.
@syedrakib Embora parênteses possam ser usados para indicar que um objeto é passível de chamada, isso não é útil no Python, pois mesmo as classes podem ser chamadas. Além disso, as funções são valores de primeira classe em Python, e você pode usá-los sem a notação parênteses, como emexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag
10
Você pode passar funções para outras funções, como map, mas no caso geral, você chama funções com argumentos e parênteses. Além disso, há algum erro de digitação no seu exemplo. presumivelmente você quer dizer filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
hughdbrown
4
Além disso, existe os.path.isfile(path)se você se preocupa apenas se é um arquivo.
Nicholas
2
Esteja ciente de que em algumas plataformas elas retornarão false se o arquivo / diretório existir, mas também ocorrerá um erro de permissão de leitura.
cowlinator
74
Tão perto! os.path.isdirretorna Truese você passar o nome de um diretório que existe atualmente. Se ele não existir ou não for um diretório, ele retornará False.
O Python 3.4 introduziu o pathlibmódulo na biblioteca padrão, que fornece uma abordagem orientada a objetos para lidar com os caminhos do sistema de arquivos. Os métodos is_dir()e exists()de um Pathobjeto podem ser usados para responder à pergunta:
In[1]:from pathlib importPathIn[2]: p =Path('/usr')In[3]: p.exists()Out[3]:TrueIn[4]: p.is_dir()Out[4]:True
Caminhos (e cadeias) podem ser unidos ao /operador:
In[5]: q = p /'bin'/'vim'In[6]: q
Out[6]:PosixPath('/usr/bin/vim')In[7]: q.exists()Out[7]:TrueIn[8]: q.is_dir()Out[8]:False
Boa decisão. Outros apontaram que os.path.isdirconseguirá isso.
usar o seguinte comando
3
Se você entende que isso não responde à pergunta, por que você não remove a resposta?
3
@CamilStaps Esta pergunta foi visualizada 354000 vezes (agora). As respostas aqui não são apenas para OP, são para qualquer um que possa vir aqui por qualquer motivo. A resposta de aganders3 é pertinente, mesmo que não resolva diretamente o problema do OP.
Gabriel
4
@ Gabriel, então deve ficar claro na resposta o que isso realmente faz.
21
Podemos verificar com 2 funções incorporadas
os.path.isdir("directory")
Dará boolean true o diretório especificado está disponível.
os.path.exists("directoryorfile")
Ele dará boolead true se o diretório ou arquivo especificado estiver disponível.
python tem funções embutidas para criar diretórios, então use melhor ao os.makedirs('mydir')invés deos.system(...)
gizzmole
9
Você está imprimindo que 'novo diretório foi criado', mas não sabe disso. E se você não tiver permissões para criar um diretório? Você imprimiria 'novo diretório foi criado', mas isso não seria verdade. Seria.
É semelhante ao embutido pathlib. A diferença é que ele trata todos os caminhos como uma string ( Pathé uma subclasse da str), portanto, se alguma função espera uma string, você pode facilmente passar um Pathobjeto para ela sem a necessidade de convertê-la em uma string.
Por exemplo, isso funciona muito bem com o Django e settings.py:
import os
ifnot os.path.exists(directory):
os.makedirs(directory)
Conforme observado nos comentários e em outros lugares, há uma condição de corrida - se o diretório for criado entre os.path.existsas os.makedirschamadas e as chamadas, a os.makedirsfalha será com um OSError. Infelizmente, a captura OSErrore a continuação de mantas não são infalíveis, pois ignoram a falha na criação do diretório devido a outros fatores, como permissões insuficientes, disco cheio, etc.
Como alternativa, pode haver um segundo os.path.exists, mas suponha que outro criou o diretório após a primeira verificação e o removeu antes da segunda - ainda poderíamos ser enganados.
Dependendo do aplicativo, o perigo de operações simultâneas pode ser mais ou menos do que o perigo causado por outros fatores, como permissões de arquivo. O desenvolvedor precisaria saber mais sobre o aplicativo específico que está sendo desenvolvido e seu ambiente esperado antes de escolher uma implementação.
As versões modernas do Python aprimoram bastante esse código, expondo FileExistsError(no 3.3 +) ...
import os
dirpath ="<dirpath>"# Replace the "<dirpath>" with actual directory path.if os.path.exists(dirpath):print("Directory exist")else:#this is optional if you want to create a directory if doesn't exist.
os.mkdir(dirpath):print("Directory created")
os.stat
, para ver se o diretório existe e é um diretório no mesmo momento.os.stat
de dizer o diretório de um arquivo. AumentaOSError
quando o caminho é inválido, não importa se é um arquivo ou diretório. Além disso, qualquer código após a verificação também é suscetível a condições de corrida.Respostas:
Você está procurando
os.path.isdir
ouos.path.exists
se não se importa se é um arquivo ou um diretório.Exemplo:
fonte
existing = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
map
, mas no caso geral, você chama funções com argumentos e parênteses. Além disso, há algum erro de digitação no seu exemplo. presumivelmente você quer dizerfilter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])
.os.path.isfile(path)
se você se preocupa apenas se é um arquivo.Tão perto!
os.path.isdir
retornaTrue
se você passar o nome de um diretório que existe atualmente. Se ele não existir ou não for um diretório, ele retornaráFalse
.fonte
O Python 3.4 introduziu o
pathlib
módulo na biblioteca padrão, que fornece uma abordagem orientada a objetos para lidar com os caminhos do sistema de arquivos. Os métodosis_dir()
eexists()
de umPath
objeto podem ser usados para responder à pergunta:Caminhos (e cadeias) podem ser unidos ao
/
operador:O Pathlib também está disponível no Python 2.7 através do módulo pathlib2 no PyPi.
fonte
p / 'bin' / 'vim'
?Sim, use
os.path.exists()
.fonte
os.path.isdir
conseguirá isso.Podemos verificar com 2 funções incorporadas
Dará boolean true o diretório especificado está disponível.
Ele dará boolead true se o diretório ou arquivo especificado estiver disponível.
Para verificar se o caminho é diretório;
os.path.isdir("directorypath")
dará boolean true se o caminho for diretório
fonte
Sim, use os.path.isdir (caminho)
fonte
Como em:
Provavelmente jogue um
os.path.isdir(...)
para ter certeza.fonte
Apenas para fornecer a
os.stat
versão (python 2):fonte
o OS oferece muitos desses recursos:
o listdir lançará uma exceção se o caminho de entrada for inválido.
fonte
fonte
os.makedirs('mydir')
invés deos.system(...)
Existe um
Unipath
módulo conveniente .Outras coisas relacionadas que você pode precisar:
Você pode instalá-lo usando o pip:
É semelhante ao embutido
pathlib
. A diferença é que ele trata todos os caminhos como uma string (Path
é uma subclasse dastr
), portanto, se alguma função espera uma string, você pode facilmente passar umPath
objeto para ela sem a necessidade de convertê-la em uma string.Por exemplo, isso funciona muito bem com o Django e
settings.py
:fonte
Você também pode criar o diretório se ele não estiver lá.
Fonte , se ainda estiver lá no SO.
==================================================== ===================
No Python ≥ 3.5, use
pathlib.Path.mkdir
:Para versões mais antigas do Python, 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 considereos.makedirs
a criação.Conforme observado nos comentários e em outros lugares, há uma condição de corrida - se o diretório for criado entre
os.path.exists
asos.makedirs
chamadas e as chamadas, aos.makedirs
falha será com umOSError
. Infelizmente, a capturaOSError
e a continuação de mantas não são infalíveis, pois ignoram a falha na criação do diretório devido a outros fatores, como permissões insuficientes, disco cheio, etc.Uma opção seria interceptar
OSError
e examinar o código de erro incorporado (consulte Existe uma maneira de obter várias plataformas de obter informações do OSError do Python ):Como alternativa, pode haver um segundo
os.path.exists
, mas suponha que outro criou o diretório após a primeira verificação e o removeu antes da segunda - ainda poderíamos ser enganados.Dependendo do aplicativo, o perigo de operações simultâneas pode ser mais ou menos do que o perigo causado por outros fatores, como permissões de arquivo. O desenvolvedor precisaria saber mais sobre o aplicativo específico que está sendo desenvolvido e seu ambiente esperado antes de escolher uma implementação.
As versões modernas do Python aprimoram bastante esse código, expondo
FileExistsError
(no 3.3 +) ...... e permitindo que um argumento de palavra-chave seja
os.makedirs
chamadoexist_ok
(em 3.2+).fonte
Duas coisas
fonte