Elenca i file SOLO nella directory corrente


225

In Python, voglio solo elencare SOLO tutti i file nella directory corrente. Non voglio file elencati da alcuna sottodirectory o genitore.

Sembra che ci siano soluzioni simili là fuori, ma non sembrano funzionare per me. Ecco il mio frammento di codice:

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

Supponiamo che io abbia 2 file, holygrail.py e Tim nella mia directory corrente. Ho anche una cartella e contiene due file - chiamiamoli Arthur e Lancillotto - al suo interno. Quando eseguo lo script, ecco cosa ottengo:

holygrail.py
Tim
Arthur
Lancelot

Sono contento di holygrail.py e Tim. Ma i due file, Arthur e Lancillotto, non voglio elencati.

Risposte:


378

Basta usare os.listdire os.path.isfileinvece di os.walk.

Esempio:

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

Ma fai attenzione mentre applichi questo ad altre directory, come

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

che non funzionerebbe perché fnon è un percorso completo ma relativo alla directory corrente.

Pertanto, per il filtro su un'altra directory, fare os.path.isfile(os.path.join(somedir, f))

(Grazie alla causalità per il suggerimento)


3
Questo è ciò di cui avevo bisogno alla fine[os.path.join(path_base,f) for f in os.listdir(path_base) if os.path.isfile(os.path.join(path_base,f))]
citynorman il

2
Questa è la sua risposta: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
Jeff Luyet il

64

È possibile utilizzare os.listdirper questo scopo. Se vuoi solo file e non directory , puoi filtrare i risultati usando os.path.isfile.

esempio:

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

o

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
Grazie per aver dato la soluzione generale (nel caso in cui la directory non sia la CWD).
jwg

10

È possibile utilizzare os.scandir(). La nuova funzione in stdlib inizia da Python 3.5.

import os

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

Più veloce di os.listdir(). os.walk() implementa os.scandir() .


5

questo può essere fatto con os.walk ()

testato da Python 3.5.2;

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)

rimuovere la riga dirs.clear () e i file nelle sottocartelle vengono nuovamente inclusi.

aggiornamento con riferimenti ;

os.walk documentato qui e parla della tripla lista creata e degli effetti topdown.

.clear () documentato qui per lo svuotamento di un elenco

quindi cancellando l'elenco pertinente da os.walk è possibile effettuare il risultato in base alle proprie esigenze.


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

Puoi migliorare questo codice con il del dirs[:]quale sarà come il seguente.

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

O ancora meglio se potessi puntare os.walk con l'attuale directory di lavoro.

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

È possibile utilizzare il modulo pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.