Connection Information

To perform the requested action, WordPress needs to access your web server. Please enter your FTP credentials to proceed. If you do not your credentials, you should your web host.

Connection Type

Connection Information

To perform the requested action, WordPress needs to access your web server. Please enter your FTP credentials to proceed. If you do not your credentials, you should your web host.

Connection Type

▷ 7 maneiras de verificar se um arquivo ou pasta existe em Python

7 maneiras de verificar se um arquivo ou pasta existe em Python

Nota: O seguinte artigo irá ajudá-lo com: 7 maneiras de verificar se um arquivo ou pasta existe em Python

A biblioteca padrão do Python contém a maioria das funcionalidades que um desenvolvedor precisaria para resolver um problema. Neste tutorial, você aprenderá diferentes maneiras de verificar a existência de um arquivo ou diretório usando apenas módulos integrados.

Verificar se um arquivo ou script está no local correto é crucial para qualquer programa CLI. Seu programa pode se tornar inútil se um arquivo específico não estiver no local no momento da execução.

No tutorial de hoje, você aprenderá algumas maneiras rápidas de verificar se um arquivo ou pasta existe em Python.

Antes de começar

Antes de executar qualquer comando abaixo, certifique-se de ter o Python 3 instalado em seu sistema. Abra seu terminal e digite o seguinte comando:

python --version
# Python 3.9.5, my result

Se você tiver uma versão 2.x, precisará usar o comando “python3”. Confira nosso guia de instalação do Python se você não tiver o Python 3 instalado.

Usaremos alguns arquivos de teste junto com este tutorial, portanto, certifique-se de criar os seguintes arquivos:

touch testfile.txt
mkdir testdirectory/ 
touch testdirectory/otherfile.txt

Os comandos acima criam um arquivo para brincar, um diretório de teste e outro arquivo dentro do diretório de testes. Os arquivos podem estar vazios, pois não precisaremos ler seu conteúdo,

Observação: Se você estiver usando o Windows, configure essa estrutura de arquivos simples com um gerenciador de arquivos gráfico.

Finalmente, usaremos o Ipython como nosso shell interativo do Python, que oferece uma interface bonita para trabalhar. Esta é apenas uma mercadoria, portanto, não é estritamente necessária.

pip install ipython

Depois de fazer isso, você terá o a um belo shell Python apenas digitando ipython.

Agora você está pronto, vamos mergulhar nas maneiras de verificar se uma pasta ou arquivo existe no Python.

Experimentar, Abrir e Exceto

Esta é a opção mais simples. Se você tentar abrir um arquivo que não existe, o Python gerará um FileNotFoundError.

In [1]: open('im-not-here.txt')
---------------------------------------------------------------------------
FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'

Podemos tirar proveito disso e lidar com a exceção caso o arquivo que estamos procurando não exista.

In [2]: try:
   ...:     file = open('im-not-here.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we\'re looking for doesn\' exist')
   ...:     exit()
   ...: 
Sorry the file we're looking for doesn't exist

No código acima estamos imprimindo uma mensagem personalizada e parando a execução do programa caso o arquivo não exista.

Observe como o saída() A função só será executada se uma exceção for levantada. Vamos ver o que acontece quando o arquivo que estamos procurando realmente existe.

In [2]: try:
   ...:     file = open('testfile.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we\'re looking for doesn\'t exist')
   ...:     exit()
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

Observe como estamos fechando o arquivo logo após abri-lo. É considerado uma boa prática de acordo com a documentação do Python.

Chamando file.write() sem usar a palavra-chave com ou chamando file.close() poderia fazer com que os argumentos de file.write() não sejam completamente gravados no disco, mesmo que o programa seja encerrado com êxito.

Mesmo que não estejamos gravando no arquivo, é extremamente recomendável fechá-lo, pois isso pode levar a vários problemas de desempenho.

Se não quisermos fechar o arquivo sozinhos, podemos usar o com gerenciador de contexto. Ele aloca e libera recursos com precisão, portanto, não precisaremos fechar o arquivo.

In [3]: try:
   ...:     with open('testfile.txt') as file:
   ...:         print(file)
   ...:         # No need to close the file
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we\'re looking for doesn\'t exist')
   ...:     exit()
   ...: 
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

Este método é extremamente útil ao escrever em arquivos, mas resulta ineficiente se queremos apenas verificar se um arquivo existe. Vamos mergulhar em outras opções para conseguir isso.

os.path.exists()

O módulo os oferece múltiplas funções para interagir com o sistema operacional. Para verificar se existe um arquivo ou pasta podemos usar o caminho.existe() função que aceita o caminho para o arquivo ou diretório como um argumento. Ele retorna um booleano baseado na existência do caminho.

Observação: Um caminho é o local exclusivo de um arquivo ou diretório em um sistema de arquivos

Em Python, o submódulo os.path contém funções projetadas exclusivamente para operar com caminhos de arquivo. Todas essas funções aceitam o argumento path como strings ou bytes, e você pode decidir trabalhar com caminhos absolutos, por exemplo:

/home/daniel/.bashrc

Ou com caminhos relativos, dependendo do diretório em que você está executando o script:

.bashrc
# Running the script in my home folder

Aqui estão vários exemplos usando o os.path.exists() função, executando no diretório meus arquivos de teste estão localizados:

In [1]: import os

In [2]: os.path.exists('testfile.txt')
Out[2]: True

In [3]: os.path.exists('testdirectory')
Out[3]: True

In [4]: os.path.exists('hey-i-dont-exist')
Out[4]: False

Como você pode ver, ele retorna Verdadeiro ao testar com o testfile.txt arquivo e o diretório de teste pasta, e Falso quando o arquivo não existe.

os.path.isfile()

Se você quisesse apenas provar a existência de um arquivo (não de um diretório), você chamaria o método os.path.isfile() função.

In [1]: import os

In [2]: os.path.isfile('testfile.txt')
Out[2]: True

In [3]: os.path.isfile('testdirectory/')
Out[3]: False

In [4]: os.path.isfile('i-dont-even-exist')
Out[4]: False

In [5]: os.path.isfile('testdirectory/otherfile.txt')
Out[5]: True

Observação: No UNIX, todos os diretórios terminam com uma barra (/), enquanto no Windows usamos uma barra invertida (\).

No código acima o isfile() retorno de função Falso em duas ocasiões, vamos ver o porquê:

  • testdirectory/ é um diretório, portanto não é considerado um arquivo. Isso não é absolutamente verdade, pois no Linux tudo é um descritor de arquivo, mas o Python trata os diretórios de maneira diferente apenas por conveniência (se você tentar abrir um diretório, obterá uma IsADirectoryError)
  • i-dont-even-exist está apontando para um arquivo que ironicamente não existe

os.path.isdir()

Se você quiser verificar se um diretório está no local correto, você precisará usar o os.path.isdir() função, que só retorna Verdadeiro se o caminho indicado apontar para um diretório.

In [1]: import os

In [2]: os.path.isdir('testfile.txt')
Out[2]: False

In [3]: os.path.isdir('testdirectory')
Out[3]: True

In [4]: os.path.isdir('anotherfile.txt')
Out[4]: False

Observe como os exemplos acima retornam Falso mesmo quando o caminho está apontando para um arquivo que existe.

Globo

O módulo glob fornece funções para trabalhar com padrões do tipo shell Unix (portanto, não funciona corretamente no Windows). Para verificar se um arquivo corresponde a um padrão dentro do diretório atual, você pode usar a função glob.glob().

In [1]: import glob

In [2]: glob.glob('testfile.txt')
Out[2]: ['testfile.txt']

In [3]: glob.glob('testdirectory')
Out[3]: ['testdirectory']

No código acima, o padrão ado para a função glob é uma string normal que representa o caminho para o arquivo e diretório de teste. Como os dois caminhos existem, a função retorna uma lista com os nomes dos caminhos correspondentes dentro dela.

Observação: Se o padrão não corresponder, você obterá uma lista vazia.

Considerando que podemos ar padrões para a função glob, por que não testar algumas das principais vantagens dela?

O código abaixo obtém todos os caminhos de arquivo com uma extensão .TXT e .py respectivamente:

In [4]: glob.glob('*.txt')
Out[4]: ['testfile.txt']

In [5]: glob.glob('*.py')
Out[5]: 
['pathlib-exists.py',
 'list-dir.py',
 'glob-file.py',
 'open-except.py',
 'subprocess-test.py',
 'isfile.py',
 'exists.py',
 'isdir.py']

Usando a classe de caminho

A classe Path é uma das melhores maneiras de trabalhar com caminhos, pois nos dá uma interface limpa para trabalhar com caminhos de arquivo como objetos.

A cereja do bolo é que as instâncias do Path têm todos os métodos necessários para obter informações sobre um determinado caminho. Isso inclui funcionalidades semelhantes às opções anteriores.

Observação: Você precisará do Python 3.4 ou superior para usar a biblioteca pathlib

Os métodos Path que você usará:

Verifique se existe um caminho

In [1]: from pathlib import Path

In [2]: Path('testfile.txt').exists()
Out[2]: True

In [3]: Path('im-not-here.txt').exists()
Out[3]: False

In [4]: Path('testdirectory').exists()
Out[4]: True

Funciona da mesma forma que os.path.exists().

Verifique se o caminho aponta para um arquivo

In [5]: Path('testfile.txt').is_file()
Out[5]: True

In [6]: Path('testdirectory').is_file()
Out[6]: False

Equivalente a os.path.isfile().

Verifique se o caminho aponta para um diretório

In [7]: Path('testfile.txt').is_dir()
Out[7]: False

In [8]: Path('testdirectory').is_dir()
Out[8]: True

Corresponde a os.caminho.isdir().

subprocesso

Se você é um amante do módulo de subprocesso, você precisa conhecer esta opção. Você pode determinar se existe um arquivo ou pasta usando o comando test.

Observação: o teste comando só funciona em Unix.

Os seguintes sinalizadores de teste farão o trabalho:

  • teste -e: Verifique se existe um caminho
  • teste -f: Verifique se existe um arquivo
  • teste-d: Verifique se existe uma pasta

Caso você queira mergulhar em mais flags de teste, você pode ler o manual executando:

man test

Verificando um caminho com subprocesso:

O código abaixo determina se existe um caminho comparando o código de retorno do subprocesso com 0.

Lembre-se que no Linux, se um processo deu certo, ele retornará zero, se não retornar, retornará qualquer outro código.

In [1]: from subprocess import run

In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0
Out[2]: True

In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0
Out[3]: False

Na primeira instrução, estamos importando o módulo de subprocesso, usando a função run e obtendo seu código de retorno.

Verificando a existência de um arquivo com subprocesso

In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0
Out[4]: True

In [5]: run(['test', '-f', 'testdirectory']).returncode == 0
Out[5]: False

Verificando um diretório com subprocesso:

In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0
Out[6]: False

In [7]: run(['test', '-d', 'testdirectory']).returncode == 0
Out[7]: True

Não é recomendado usar essa opção, pois consome mais recursos e não estamos obtendo nenhuma vantagem com isso.

Resumindo

Python é uma das linguagens de programação mais utilizadas para automatizar processos interagindo com o SO. Uma coisa legal que você pode fazer com ele é verificar se existe um arquivo ou uma pasta.

Os mais simples de fazer são:

  • Abrindo e manipulando exceções de arquivo imediatamente
  • Usando o existe() função do os.path ou pathlib módulos.

Neste tutorial você aprendeu:

  • Como abrir um arquivo e lidar com exceções caso ele não exista
  • O significado dos caminhos
  • 3 funções diferentes o os.path submódulo fornece para verificar a existência de um arquivo ou pasta
  • O Unix usa barras (/), enquanto o Windows usa barras invertidas (\)

Leia a seguir: O que é um subprocesso em Python? [5 Usage Examples]