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.

slam_duncan
fonte

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)

bicho-preguiça
fonte
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.
mgilson
fonte
20
import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]
Nasimuddin Ansari
fonte
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() .

prasastoadi
fonte
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.

2114L3
fonte
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
Ozgur Oz
fonte
3

em vez de os.walk, basta usaros.listdir

Inbar Rose
fonte
1

Você pode usar o módulo pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
Pygirl
fonte