Como posso encontrar todos os arquivos em um diretório com a extensão .txt
em python?
1043
Você pode usar glob
:
import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
print(file)
ou simplesmente os.listdir
:
import os
for file in os.listdir("/mydir"):
if file.endswith(".txt"):
print(os.path.join("/mydir", file))
ou se você quiser atravessar o diretório, use os.walk
:
import os
for root, dirs, files in os.walk("/mydir"):
for file in files:
if file.endswith(".txt"):
print(os.path.join(root, file))
for file in f
que para,for files in f
uma vez que o que está na variável é um único nome de arquivo. Melhor ainda seria mudar osf
tofiles
e então os loops for poderiam se tornarfor file in files
.file
não é uma palavra reservada, apenas o nome de uma função predefinida, por isso é bem possível usá-la como um nome de variável em seu próprio código. Embora seja verdade que geralmente se deve evitar colisões como essa,file
é um caso especial, porque quase nunca há necessidade de usá-lo, por isso é frequentemente considerado uma exceção à diretriz. Se você não quiser fazer isso, o PEP8 recomenda anexar um único sublinhado a esses nomes, ou sejafile_
, o que você teria que concordar que ainda é bastante legível.Use glob .
fonte
glob
para não encontrar arquivos recursivamente se o seu python estiver abaixo de 3,5. mais informadaAlgo assim deve fazer o trabalho
fonte
root, dirs, files
vez der, d, f
. Muito mais legível.Algo assim vai funcionar:
fonte
os.path.join
em cada elemento detext_files
. Pode ser algo parecidotext_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt')]
.Você pode simplesmente usar
pathlib
s 1 :glob
ou em um loop:
Se você quiser recursivo, você pode usar
.glob('**/*.txt)
1 O
pathlib
módulo foi incluído na biblioteca padrão no python 3.4. Mas você pode instalar portas traseiras desse módulo, mesmo em versões mais antigas do Python (ou seja, usandoconda
orpip
):pathlib
epathlib2
.fonte
**/*.txt
não é suportado pelo python mais velho versions.So Eu resolvi isso com:foundfiles= subprocess.check_output("ls **/*.txt", shell=True)
for foundfile in foundfiles.splitlines():
print foundfile
pathlib
posso fazer e eu já incluí os requisitos de versão do Python. :) Mas se sua abordagem ainda não foi publicada, por que não adicioná-la como outra resposta?rglob
se desejar procurar itens recursivamente. Por exemplo.rglob('*.txt')
fonte
Eu gosto do os.walk () :
Ou com geradores:
fonte
Aqui estão mais versões do mesmo que produzem resultados ligeiramente diferentes:
glob.iglob ()
glob.glob1 ()
fnmatch.filter ()
fonte
glob1()
é uma função auxiliar noglob
módulo que não está listada na documentação do Python. Existem alguns comentários embutidos descrevendo o que ele faz no arquivo de origem, consulte.../Lib/glob.py
.glob.glob1()
não é público, mas está disponível no Python 2.4-2.7; 3.0-3.2; pypy; jython github.com/zed/test_glob1glob
módulo.path.py é outra alternativa: https://github.com/jaraco/path.py
fonte
for f in p.walk(pattern='*.txt')
passar por cada subpastaslist(p.glob('**/*.py'))
Python v3.5 +
Método rápido usando os.scandir em uma função recursiva. Pesquisa todos os arquivos com uma extensão especificada na pasta e nas subpastas.
Atualização em abril de 2019
Se você estiver pesquisando em diretórios que contêm arquivos de 10.000, anexar a uma lista se tornará ineficiente. 'Produzir' os resultados é uma solução melhor. Também incluí uma função para converter a saída em um Dataframe do Pandas.
fonte
Python tem todas as ferramentas para fazer isso:
fonte
all_txt_files = list(filter(lambda x: x.endswith('.txt'), os.listdir(the_dir)))
Para obter todos os nomes de arquivos '.txt' dentro da pasta 'dataPath' como uma lista de maneira Pythonic:
fonte
Tente isso, ele encontrará todos os seus arquivos recursivamente:
fonte
**
. Disponível apenas em python 3. O que eu não gosto é achdir
parte. Não é preciso isso.filepath = os.path.join('wallpaper')
e depois usá-lo comoglob.glob(filepath+"**/*.psd", recursive = True)
, o que produziria o mesmo resultado.fonte
Fiz um teste (Python 3.6.4, W7x64) para ver qual solução é a mais rápida para uma pasta, sem subdiretórios, para obter uma lista dos caminhos completos dos arquivos com uma extensão específica.
Para resumir, essa tarefa
os.listdir()
é a mais rápida e é 1,7x mais rápida que a seguinte:os.walk()
(com uma folga!), 2,7x mais rápida quepathlib
, 3,2x mais rápidaos.scandir()
e 3,3x mais rápidaglob
.Lembre-se de que esses resultados serão alterados quando você precisar de resultados recursivos. Se você copiar / colar um método abaixo, adicione um .lower (), caso contrário .EXT não seria encontrado ao pesquisar .ext.
Resultados:
fonte
Este código torna minha vida mais simples.
fonte
Use fnmatch: https://docs.python.org/2/library/fnmatch.html
fonte
Para obter uma matriz de nomes de arquivo ".txt" de uma pasta chamada "data" no mesmo diretório, costumo usar esta simples linha de código:
fonte
Eu sugiro que você use fnmatch e o método superior. Dessa forma, você pode encontrar um dos seguintes:
.
fonte
Aqui está um com
extend()
fonte
.txt
:)Solução funcional com subdiretórios:
fonte
Caso a pasta contenha muitos arquivos ou a memória seja uma restrição, considere o uso de geradores:
Opção A: Iterar
Opção B: obter todos
fonte
Uma solução para copiar e colar, semelhante à do ghostdog:
fonte
use o módulo Python OS para encontrar arquivos com extensão específica.
o exemplo simples está aqui:
fonte
Muitos usuários responderam com
os.walk
respostas, que incluem todos os arquivos, mas também todos os diretórios e subdiretórios e seus arquivos.Ou para um caso em que você não precisa de um gerador:
Se você vai usar correspondências para outra coisa, convém fazer uma lista em vez de uma expressão geradora:
fonte
Um método simples usando
for
loop:Embora isso possa ser mais generalizado.
fonte