Estou tentando obter uma lista de arquivos em um diretório usando Python, mas não quero uma lista de TODOS os arquivos.
O que eu quero essencialmente é a capacidade de fazer algo como o seguinte, mas usando Python e não executando ls.
ls 145592*.jpg
Se não houver um método interno para isso, estou pensando em escrever um loop for para iterar os resultados de um os.listdir()
e anexar todos os arquivos correspondentes a uma nova lista.
No entanto, existem muitos arquivos nesse diretório e, portanto, espero que exista um método mais eficiente (ou um método interno).
Respostas:
glob.glob('145592*.jpg')
fonte
glob.glob('145592*.jpg')
imprime todo o caminho absoluto dos arquivos, enquantols 145592*.jpg
imprime apenas a lista de arquivos.glob()
apenas usa listdir + fnmatch, em vez de chamadas especiais do sistema operacional para fazer a filtragem de caracteres curinga. Por exemplo, no Windows, aFindFirstFile
API permite que você especifique curingas para que o sistema operacional faça a filtragem diretamente e, presumivelmente, com mais eficiência (não acho que exista um equivalente no Linux).glob.glob()
é definitivamente a maneira de fazê-lo (conforme Ignacio). No entanto, se você precisar de uma correspondência mais complicada, poderá fazê-lo com uma compreensão da lista ere.match()
, algo como:Mais flexível, mas como você observa, menos eficiente.
fonte
[0-9]+
[0123456789]
sequências ( consulte a documentação ) e também possui afnmatch.filter()
função que torna esse loop um pouco mais eficiente.Mantenha simples:
Eu prefiro essa forma de compreensão de lista porque ela lê bem em inglês.
Li a quarta linha como: Para cada fn no os.listdir do meu caminho, forneça apenas os que correspondem a qualquer uma das minhas extensões incluídas.
Pode ser difícil para os programadores iniciantes de python realmente se acostumarem a usar compreensões de lista para filtragem, e pode ter alguma sobrecarga de memória para conjuntos de dados muito grandes, mas para listar um diretório e outras tarefas simples de filtragem de strings, as compreensões de lista levam a uma limpeza mais clara código documentável.
A única coisa sobre esse design é que ele não protege contra o erro de passar uma string em vez de uma lista. Por exemplo, se você acidentalmente converter uma string em uma lista e acabar verificando todos os caracteres de uma string, poderá acabar recebendo uma série de falsos positivos.
Mas é melhor ter um problema fácil de corrigir do que uma solução difícil de entender.
fonte
any()
aqui, porquestr.endswith()
leva uma sequência de finais.if fn.endswith(included_extentensions)
é mais que suficiente.str.endswith(seq)
que Martijn apontou, isso não está correto, porque um arquivo precisa terminar.ext
para ter essa extensão. Este código também encontrará (por exemplo) um arquivo chamado "myjpg" ou um diretório chamado apenas "png". Para corrigir, basta prefixar cada extensãoincluded_extensions
com a.
.included_extensions
vsincluded_extentsions
? Uma pena, porque caso contrário, esta é a minha resposta preferida.Outra opção:
https://docs.python.org/3/library/fnmatch.html
fonte
glob
ocorre em uma única linha.glob
retornar o caminho completo, em vez deos.listdir
apenas retornar o nome do arquivo. Pelo menos isso é o que está acontecendo em Python 2.Filtrar com
glob
módulo:Import glob
Curingas:
Extensão Fiter
.txt
:Um único caractere
Intervalos numéricos
Faixas do alfabeto
fonte
Código preliminar
Solução 1 - use "glob"
Solução 2 - use "os" + "fnmatch"
Variante 2.1 - Pesquisa no diretório atual
Variante 2.2 - Pesquisa recursiva
Resultado
Solução 3 - use "pathlib"
Notas:
fonte
use os.walk para listar recursivamente seus arquivos
fonte
file.endswith(alist_filter)
basta.Isso fornecerá uma lista de arquivos jpg com o caminho completo. Você pode substituir
x[0]+"/"+f
comf
por apenas nomes de arquivos. Você também pode substituirf.endswith(".jpg")
por qualquer condição de string que desejar.fonte
você também pode gostar de uma abordagem de alto nível (eu implementei e empacotei como findtools ):
pode ser instalado com
fonte
Nomes de arquivos com extensões "jpg" e "png" em "caminho / para / imagens":
fonte
Você pode usar o pathlib que está disponível na biblioteca padrão Python 3.4 e posterior.
fonte
Você pode definir um padrão e verificar se há. Aqui eu peguei o padrão inicial e final e procurei no nome do arquivo. ARQUIVOS contém a lista de todos os arquivos em um diretório.
fonte
Que tal str.split ()? Nada para importar.
fonte
f.endswith('.jpg')
(mas também selecionaráfilename.jpg.ext
)Você pode usar subprocess.check_ouput () como
Obviamente, a sequência entre aspas pode ser qualquer coisa que você queira executar no shell e armazenar a saída.
fonte
ls
A saída de não deve ser analisada .