Listar arquivos APENAS no diretório atual


225

No Python, eu quero apenas listar todos os arquivos no diretório atual SOMENTE. Não quero arquivos listados em nenhum subdiretório ou pai.

Parece haver soluções semelhantes por aí, mas elas não parecem funcionar para mim. Aqui está o meu trecho de código:

import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

Vamos supor que eu tenha 2 arquivos, holygrail.py e Tim, dentro do meu diretório atual. Também tenho uma pasta e ela contém dois arquivos - vamos chamá-los de Arthur e Lancelot - dentro dela. Quando executo o script, é isso que recebo:

holygrail.py
Tim
Arthur
Lancelot

Estou feliz com holygrail.py e Tim. Mas os dois arquivos, Arthur e Lancelot, não quero listados.

Respostas:


378

Basta usar os.listdire em os.path.isfilevez de os.walk.

Exemplo:

import os
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
    # do something

Mas tenha cuidado ao aplicar isso a outro diretório, como

files = [f for f in os.listdir(somedir) if os.path.isfile(f)].

que não funcionaria porque fnão é um caminho completo, mas relativo ao diretório atual.

Portanto, para filtrar em outro diretório, faça os.path.isfile(os.path.join(somedir, f))

(Obrigado causalidade pela dica)


3
Isto é o que eu precisava no final[os.path.join(path_base,f) for f in os.listdir(path_base) if os.path.isfile(os.path.join(path_base,f))]
citynorman

2
Esta é a sua resposta: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
Jeff Luyet

64

Você pode usar os.listdirpara esse fim. Se você deseja apenas arquivos e não diretórios , pode filtrar os resultados usando os.path.isfile.

exemplo:

files = os.listdir(os.curdir)  #files and directories

ou

files = filter(os.path.isfile, os.listdir( os.curdir ) )  # files only
files = [ f for f in os.listdir( os.curdir ) if os.path.isfile(f) ] #list comprehension version.

20
import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]

3
Obrigado por fornecer a solução geral (no caso em que o diretório não é o cwd).
GTC

10

Você pode usar os.scandir(). A nova função no stdlib inicia no Python 3.5.

import os

for entry in os.scandir('.'):
    if entry.is_file():
        print(entry.name)

Mais rápido que os.listdir(). os.walk() implementa os.scandir() .


5

isso pode ser feito com os.walk ()

python 3.5.2 testado;

import os
for root, dirs, files in os.walk('.', topdown=True):
    dirs.clear() #with topdown true, this will prevent walk from going into subs
    for file in files:
      #do some stuff
      print(file)

remova a linha dirs.clear () e os arquivos nas subpastas serão incluídos novamente.

atualização com referências ;

o os.walk documentado aqui e fala sobre a lista tripla sendo criada e os efeitos de cima para baixo .

.clear () documentado aqui para esvaziar uma lista

portanto, limpando a lista relevante do os.walk, você pode efetuar o resultado conforme suas necessidades.


4
import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

Você pode melhorar esse código com o del dirs[:]qual será semelhante a seguir.

import os
for subdir, dirs, files in os.walk('./'):
    del dirs[:]
    for file in files:
      do some stuff
      print file

Ou melhor ainda, se você pudesse apontar o os.walk com o diretório de trabalho atual.

import os
cwd = os.getcwd()
for subdir, dirs, files in os.walk(cwd, topdown=True):
    del dirs[:]  # remove the sub directories.
    for file in files:
      do some stuff
      print file


1

Você pode usar o módulo pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.