Verzeichnis-Baum-Eintrag in Python
-
02-07-2019 - |
Frage
Wie bekomme ich eine Liste aller Dateien (und Verzeichnisse) in einem bestimmten Verzeichnis in Python?
Lösung
Dies ist eine Möglichkeit, jede Datei und Verzeichnis in einem Verzeichnisbaum zu durchlaufen:
import os
for dirname, dirnames, filenames in os.walk('.'):
# print path to all subdirectories first.
for subdirname in dirnames:
print(os.path.join(dirname, subdirname))
# print path to all filenames.
for filename in filenames:
print(os.path.join(dirname, filename))
# Advanced usage:
# editing the 'dirnames' list will stop os.walk() from recursing into there.
if '.git' in dirnames:
# don't go into any .git directories.
dirnames.remove('.git')
Andere Tipps
Sie können mit
os.listdir(path)
Als Referenz und OS-Funktionen hier:
- Python 2 docs: https://docs.python.org/ 2 / library / os.html # os.listdir
- Python 3 docs: https://docs.python.org/ 3 / library / os.html # os.listdir
Hier ist eine Hilfsfunktion, verwende ich oft:
import os
def listdir_fullpath(d):
return [os.path.join(d, f) for f in os.listdir(d)]
import os
for filename in os.listdir("C:\\temp"):
print filename
Wenn Sie Globbing Fähigkeiten benötigen, gibt es ein Modul für das auch. Zum Beispiel:
import glob
glob.glob('./[0-9].*')
wird wieder so etwas wie:
['./1.gif', './2.txt']
Sehen Sie die Dokumentation hier .
Versuchen Sie folgendes:
import os
for top, dirs, files in os.walk('./'):
for nm in files:
print os.path.join(top, nm)
Für Dateien im aktuellen Arbeitsverzeichnis, ohne einen Pfad angeben
Python 2.7:
import os
os.listdir(os.getcwd())
Python 3.x:
import os
os.listdir()
Dank Stam Kaly für einen Kommentar zu Python 3.x
Eine rekursive Implementierung
import os
def scan_dir(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
if os.path.isfile(path):
print path
else:
scan_dir(path)
Ich schrieb eine lange Version, mit allen Optionen, die ich brauchen könnte: http: // sam.nipl.net/code/python/find.py
Ich denke, es wird passen auch hier:
#!/usr/bin/env python
import os
import sys
def ls(dir, hidden=False, relative=True):
nodes = []
for nm in os.listdir(dir):
if not hidden and nm.startswith('.'):
continue
if not relative:
nm = os.path.join(dir, nm)
nodes.append(nm)
nodes.sort()
return nodes
def find(root, files=True, dirs=False, hidden=False, relative=True, topdown=True):
root = os.path.join(root, '') # add slash if not there
for parent, ldirs, lfiles in os.walk(root, topdown=topdown):
if relative:
parent = parent[len(root):]
if dirs and parent:
yield os.path.join(parent, '')
if not hidden:
lfiles = [nm for nm in lfiles if not nm.startswith('.')]
ldirs[:] = [nm for nm in ldirs if not nm.startswith('.')] # in place
if files:
lfiles.sort()
for nm in lfiles:
nm = os.path.join(parent, nm)
yield nm
def test(root):
print "* directory listing, with hidden files:"
print ls(root, hidden=True)
print
print "* recursive listing, with dirs, but no hidden files:"
for f in find(root, dirs=True):
print f
print
if __name__ == "__main__":
test(*sys.argv[1:])
Ein schönes Motto, nur die Dateien rekursiv aufzulisten. Früher habe ich dies in meiner setup.py package_data Richtlinie:
import os
[os.path.join(x[0],y) for x in os.walk('<some_directory>') for y in x[2]]
Ich weiß, es ist nicht die Antwort auf die Frage, sondern kommen in praktisch
Für Python 2
#!/bin/python2
import os
def scan_dir(path):
print map(os.path.abspath, os.listdir(pwd))
Für Python 3
Für Filter und Karte, müssen Sie sie mit der Liste wickeln ()
#!/bin/python3
import os
def scan_dir(path):
print(list(map(os.path.abspath, os.listdir(pwd))))
Die Empfehlung ist jetzt, dass Sie Ihre Nutzung der Karte ersetzen und Filter mit Generatoren Ausdrücke oder Listenkomprehensionen:
#!/bin/python
import os
def scan_dir(path):
print([os.path.abspath(f) for f in os.listdir(path)])
Hier ist eine eine Zeile Pythonic Version:
import os
dir = 'given_directory_name'
filenames = [os.path.join(os.path.dirname(os.path.abspath(__file__)),dir,i) for i in os.listdir(dir)]
Dieser Code enthält den vollständigen Pfad aller Dateien und Verzeichnisse im angegebenen Verzeichnisnamen.
Hier ist eine weitere Option.
os.scandir(path='.')
Es gibt einen Iterator von os.DirEntry Objekten der Einträge, die (zusammen mit Dateiattributinformationen) im Verzeichnis durch den Pfad angegeben.
Beispiel:
with os.scandir(path) as it:
for entry in it:
if not entry.name.startswith('.'):
print(entry.name)
Mit scandir () anstelle von listdir () kann erheblich die Leistung des Codes erhöhen, die auch den Dateityp oder Dateiattributinformationen , weil os.DirEntry Objekte belichten diese Informationen, wenn das Betriebssystem bietet es braucht beim Scannen eines Verzeichnisses. Alle os.DirEntry Methoden kann ein Systemaufruf, aber is_dir () und is_file () führen in der Regel nur einen Systemaufruf für symbolische Links erfordern; os.DirEntry.stat () erfordert immer einen Systemaufruf auf Unix, sondern erfordert nur eine für symbolische Links unter Windows.
#import modules
import os
_CURRENT_DIR = '.'
def rec_tree_traverse(curr_dir, indent):
"recurcive function to traverse the directory"
#print "[traverse_tree]"
try :
dfList = [os.path.join(curr_dir, f_or_d) for f_or_d in os.listdir(curr_dir)]
except:
print "wrong path name/directory name"
return
for file_or_dir in dfList:
if os.path.isdir(file_or_dir):
#print "dir : ",
print indent, file_or_dir,"\\"
rec_tree_traverse(file_or_dir, indent*2)
if os.path.isfile(file_or_dir):
#print "file : ",
print indent, file_or_dir
#end if for loop
#end of traverse_tree()
def main():
base_dir = _CURRENT_DIR
rec_tree_traverse(base_dir," ")
raw_input("enter any key to exit....")
#end of main()
if __name__ == '__main__':
main()
FYI einen Filter der Verlängerung oder ext Datei hinzufügen import os
path = '.'
for dirname, dirnames, filenames in os.walk(path):
# print path to all filenames with extension py.
for filename in filenames:
fname_path = os.path.join(dirname, filename)
fext = os.path.splitext(fname_path)[1]
if fext == '.py':
print fname_path
else:
continue
import os, sys
#open files in directory
path = "My Documents"
dirs = os.listdir( path )
# print the files in given directory
for file in dirs:
print (file)
Wenn dachte, ich würde diese werfen. Einfache und schmutzige Weise Wildcard Durchsuchungen zu tun.
import re
import os
[a for a in os.listdir(".") if re.search("^.*\.py$",a)]
Im Folgenden Code listet Verzeichnisse und Dateien im Verzeichnis
def print_directory_contents(sPath):
import os
for sChild in os.listdir(sPath):
sChildPath = os.path.join(sPath,sChild)
if os.path.isdir(sChildPath):
print_directory_contents(sChildPath)
else:
print(sChildPath)
Ich weiß, dass dies eine alte Frage. Dies ist eine nette Art und Weise stieß ich auf, wenn Sie auf einem liunx Maschine sind.
import subprocess
print(subprocess.check_output(["ls", "/"]).decode("utf8"))
Der mit mir gearbeitet ist ein bisschen eine modifizierte Version von Saleh oben beantworten.
Der Code lautet wie folgt:
"dir = 'given_directory_name' Dateinamen = [os.path.abspath (os.path.join (dir, i)) für i in os.listdir (dir)]"
Während os.listdir()
ist in Ordnung für eine Liste von Datei Erzeugung und dir Namen, häufig möchten Sie mehr tun, wenn Sie diese Namen haben - und in Python3, pathlib macht diese anderen Aufgaben einfach. Lassen Sie uns einen Blick darauf werfen und sehen, wenn Sie es so viel wie, wie ich.
Um dir Inhalt auflisten, ein Path-Objekt konstruieren und den Iterator greifen:
In [16]: Path('/etc').iterdir()
Out[16]: <generator object Path.iterdir at 0x110853fc0>
Wenn wir nur eine Liste mit 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 werden soll:
In [20]: [x.name for x in Path('/etc').glob('**/*.conf')]
Out[20]:
['ntp-restrict.conf',
'dnsextd.conf',
'syslog.conf',
Wenn Sie eine Liste von conf Dateien im Baum> = 1 K:
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',
Auflösen relative Pfade werden einfach:
In [32]: Path('../Operational Metrics.md').resolve()
Out[32]: PosixPath('/Users/starver/code/xxxx/Operational Metrics.md')
mit einem Pfad zu navigieren ist ziemlich klar (obwohl 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'),