Como descobrir se o diretório existe em Python

1139

No osmódulo em Python, existe uma maneira de descobrir se existe um diretório, algo como:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False
David542
fonte
8
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.
GeoStoneMarten

Respostas:

1729

Você está procurando os.path.isdirou os.path.existsse não se importa se é um arquivo ou um diretório.

Exemplo:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))
phihag
fonte
4
@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.

Kirk Strauser
fonte
70

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 import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [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]: True

In [8]: q.is_dir()
Out[8]: False

O Pathlib também está disponível no Python 2.7 através do módulo pathlib2 no PyPi.

joelostblom
fonte
Alguma explicação seria útil. Por que você está fazendo " p / 'bin' / 'vim'?
Nathan
1
@ Frank Eu elaborei um pouco a segunda parte da resposta.
joelostblom 25/01
34

Sim, use os.path.exists().

aganders3
fonte
23
Isso não verifica se o caminho é um diretório.
precisa saber é o seguinte
7
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.

Para verificar se o caminho é diretório;

os.path.isdir("directorypath")

dará boolean true se o caminho for diretório

Vivek Ananthan
fonte
2
Isso é totalmente redundante com a resposta principal mais antiga.
Davis Herring
10

Como em:

In [3]: os.path.exists('/d/temp')
Out[3]: True

Provavelmente jogue um os.path.isdir(...)para ter certeza.

AlG
fonte
10

Apenas para fornecer a os.statversão (python 2):

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise
Tyler A.
fonte
7

o OS oferece muitos desses recursos:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

o listdir lançará uma exceção se o caminho de entrada for inválido.

dputros
fonte
5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')
JoboFive
fonte
6
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.
Wojciech Jakubas
4

Existe um Unipathmódulo conveniente .

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

Outras coisas relacionadas que você pode precisar:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

Você pode instalá-lo usando o pip:

$ pip3 install unipath

É 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:

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'
Max Malysh
fonte
4

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:

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

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.existse considere os.makedirsa criação.

import os
if not 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.

Uma opção seria interceptar OSErrore examinar o código de erro incorporado (consulte Existe uma maneira de obter várias plataformas 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

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 +) ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... e permitindo que um argumento de palavra-chave seja os.makedirschamadoexist_ok (em 3.2+).

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.
Nathan
fonte
0

Duas coisas

  1. verifique se o diretório existe?
  2. caso contrário, crie um diretório (opcional).
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")
Uday Kiran
fonte