Frage

Wie bekomme ich eine Liste aller Dateien (und Verzeichnisse) in einem bestimmten Verzeichnis in Python?

War es hilfreich?

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:

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.

Python Docs

#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'),
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top