Wie erhalte ich eine Liste aller Dateien (und Verzeichnisse) in einem bestimmten Verzeichnis in Python?
In einer Zeile: [top + os.sep + f for top, dirs, files in os.walk('./') for f in files]
Wie erhalte ich eine Liste aller Dateien (und Verzeichnisse) in einem bestimmten Verzeichnis in Python?
Während os.listdir()
ist gut geeignet, um eine Liste von Datei- und Verzeichnisnamen zu generieren, häufig möchte man aber mehr tun, sobald man diese Namen hat - und das in Python3, pathlib macht diese anderen Aufgaben einfach. Schauen wir mal, ob es Ihnen auch so gut gefällt wie mir.
Um den Inhalt eines Verzeichnisses aufzulisten, konstruieren Sie ein Path-Objekt und nehmen den Iterator:
In [16]: Path('/etc').iterdir()
Out[16]: <generator object Path.iterdir at 0x110853fc0>
Wenn wir nur eine Liste von Namen von Dingen wollen:
In [17]: [x.name for x in Path('/etc').iterdir()]
Out[17]:
['emond.d',
'ntp-restrict.conf',
'periodic',
Wenn Sie nur die Verzeichnisse wollen:
In [18]: [x.name for x in Path('/etc').iterdir() if x.is_dir()]
Out[18]:
['emond.d',
'periodic',
'mach_init.d',
Wenn Sie die Namen aller conf-Dateien in diesem Baum benötigen:
In [20]: [x.name for x in Path('/etc').glob('**/*.conf')]
Out[20]:
['ntp-restrict.conf',
'dnsextd.conf',
'syslog.conf',
Wenn Sie eine Liste der conf-Dateien im Baum >= 1K benötigen:
In [23]: [x.name for x in Path('/etc').glob('**/*.conf') if x.stat().st_size > 1024]
Out[23]:
['dnsextd.conf',
'pf.conf',
'autofs.conf',
Das Auflösen von relativen Pfaden wird einfach:
In [32]: Path('../Operational Metrics.md').resolve()
Out[32]: PosixPath('/Users/starver/code/xxxx/Operational Metrics.md')
Das Navigieren mit einem Pfad ist ziemlich klar (wenn auch unerwartet):
In [10]: p = Path('.')
In [11]: core = p / 'web' / 'core'
In [13]: [x for x in core.iterdir() if x.is_file()]
Out[13]:
[PosixPath('web/core/metrics.py'),
PosixPath('web/core/services.py'),
PosixPath('web/core/querysets.py'),
Hier ist eine weitere Möglichkeit.
os.scandir(path='.')
Sie gibt einen Iterator von os.DirEntry-Objekten zurück, die den Einträgen (zusammen mit Dateiattributinformationen) in dem durch path angegebenen Verzeichnis entsprechen.
Beispiel:
with os.scandir(path) as it:
for entry in it:
if not entry.name.startswith('.'):
print(entry.name)
Die Verwendung von scandir() anstelle von listdir() kann die Leistung von Code, der auch Informationen über den Dateityp oder die Dateiattribute benötigt, erheblich steigern Denn os.DirEntry-Objekte geben diese Informationen preis, wenn das Betriebssystem sie beim Scannen eines Verzeichnisses bereitstellt. Alle os.DirEntry-Methoden können einen Systemaufruf ausführen, aber is_dir() und is_file() erfordern in der Regel nur einen Systemaufruf für symbolische Links; os.DirEntry.stat() erfordert unter Unix immer einen Systemaufruf, unter Windows jedoch nur einen für symbolische Links.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
2 Stimmen
Rekursiv oder nicht? Bitte klären Sie das. Für nicht rekursive Lösungen siehe: stackoverflow.com/questions/973473/