Listen Sie NUR Dateien im aktuellen Verzeichnis auf

224

In Python möchte ich NUR alle Dateien im aktuellen Verzeichnis auflisten. Ich möchte nicht, dass Dateien aus einem Unterverzeichnis oder einem übergeordneten Verzeichnis aufgelistet werden.

Es scheint ähnliche Lösungen zu geben, aber sie scheinen für mich nicht zu funktionieren. Hier ist mein Code-Snippet:

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

Nehmen wir an, ich habe 2 Dateien, Holygrail.py und Tim, in meinem aktuellen Verzeichnis. Ich habe auch einen Ordner, der zwei Dateien enthält - nennen wir sie Arthur und Lancelot. Wenn ich das Skript ausführe, bekomme ich Folgendes:

holygrail.py
Tim
Arthur
Lancelot

Ich bin glücklich mit Holygrail.py und Tim. Aber die beiden Dateien, Arthur und Lancelot, möchte ich nicht auflisten.

slam_duncan
quelle

Antworten:

375

Verwenden Sie einfach os.listdirund os.path.isfileanstelle von os.walk.

Beispiel:

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

Aber seien Sie vorsichtig, wenn Sie dies auf ein anderes Verzeichnis anwenden, wie z

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

Das würde nicht funktionieren, da fes sich nicht um einen vollständigen Pfad handelt, sondern relativ zum aktuellen Verzeichnis.

Führen Sie daher zum Filtern in einem anderen Verzeichnis Folgendes aus os.path.isfile(os.path.join(somedir, f))

(Danke Causality für den Hinweis)

Faultier
quelle
3
Dies ist, was ich am Ende brauchte[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
Dies ist seine Antwort: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
Jeff Luyet
64

Sie können os.listdirfür diesen Zweck verwenden. Wenn Sie nur Dateien und keine Verzeichnisse möchten , können Sie die Ergebnisse mit filtern os.path.isfile.

Beispiel:

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

oder

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
quelle
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
quelle
3
Vielen Dank für die allgemeine Lösung (für den Fall, dass das Verzeichnis nicht das CWD ist).
JWG
10

Sie können verwenden os.scandir(). Neue Funktion in stdlib startet ab Python 3.5.

import os

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

Schneller als os.listdir(). os.walk() Geräte os.scandir() .

Prasastoadi
quelle
5

Dies kann mit os.walk () erfolgen

Python 3.5.2 getestet;

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)

Entfernen Sie die Zeile dirs.clear (), und die Dateien in den Unterordnern werden wieder aufgenommen.

Update mit Referenzen ;

os.walk ist hier dokumentiert und spricht über die erstellte Dreifachliste und Topdown-Effekte.

.clear () wird hier zum Leeren einer Liste dokumentiert

Wenn Sie also die relevante Liste von os.walk löschen, können Sie das Ergebnis an Ihre Bedürfnisse anpassen.

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

Sie können diesen Code del dirs[:]wie folgt verbessern .

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

Oder noch besser, wenn Sie mit dem aktuellen Arbeitsverzeichnis auf os.walk zeigen könnten.

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
quelle
3

stattdessen os.walkeinfach verwendenos.listdir

Inbar Rose
quelle
1

Sie können das pathlib-Modul verwenden.

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