it-swarm.com.de

Wie kann ich Dateien in einem bestimmten Verzeichnis durchlaufen?

Ich muss alle .asm -Dateien in einem bestimmten Verzeichnis durchlaufen und einige Aktionen für sie ausführen.

Wie kann dies auf effiziente Weise erfolgen?

439
Itzik984

Ursprüngliche Antwort:

import os

for filename in os.listdir(directory):
    if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
        continue
    else:
        continue

Python 3.6-Version der obigen Antwort mit os - vorausgesetzt, Sie haben den Verzeichnispfad als str-Objekt in einer Variablen mit dem Namen directory_in_str:

import os

directory = os.fsencode(directory_in_str)

for file in os.listdir(directory):
     filename = os.fsdecode(file)
     if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
         continue
     else:
         continue

Oder rekursiv mit pathlib :

from pathlib import Path

pathlist = Path(directory_in_str).glob('**/*.asm')
for path in pathlist:
     # because path is object not string
     path_in_str = str(path)
     # print(path_in_str)
659
anselm

Dadurch werden alle untergeordneten Dateien durchlaufen, nicht nur die untergeordneten Dateien des Verzeichnisses:

import os

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        #print os.path.join(subdir, file)
        filepath = subdir + os.sep + file

        if filepath.endswith(".asm"):
            print (filepath)
118
pedromateo

Sie können das Modul glob verwenden:

import glob

for filepath in glob.iglob('my_dir/*.asm'):
    print(filepath)

und seit Python 3.5 können Sie auch Unterverzeichnisse durchsuchen:

glob.glob('**/*.txt', recursive=True) # => ['2.txt', 'sub/3.txt']

Aus den Dokumenten:

Das Glob-Modul findet alle Pfadnamen, die mit einem angegebenen Muster übereinstimmen, gemäß den von der Unix-Shell verwendeten Regeln, obwohl die Ergebnisse in willkürlicher Reihenfolge zurückgegeben werden. Es wird keine Tilde-Erweiterung durchgeführt, aber *,? Und mit [] ausgedrückte Zeichenbereiche werden korrekt abgeglichen.

111
Doboy

Python 3.4 und höher bieten pathlib in der Standardbibliothek an. Du könntest es tun:

from pathlib import Path

asm_pths = [pth for pth in Path.cwd().iterdir()
            if pth.suffix == '.asm']

Oder wenn Sie Listenverständnisse nicht mögen:

asm_paths = []
for pth in Path.cwd().iterdir():
    if pth.suffix == '.asm':
        asm_pths.append(pth)

Path Objekte können einfach in Zeichenfolgen konvertiert werden.

15
Greg

So durchlaufe ich Dateien in Python:

import os

path = 'the/name/of/your/path'

folder = os.fsencode(path)

filenames = []

for file in os.listdir(folder):
    filename = os.fsdecode(file)
    if filename.endswith( ('.jpeg', '.png', '.gif') ): # whatever file types you're using...
        filenames.append(filename)

filenames.sort() # now you have the filenames and can do something with them

KEINE DIESER TECHNIKEN GARANTIERT JEDE ITERATIONSBESTELLUNG

Ja, super unberechenbar. Beachten Sie, dass ich die Dateinamen sortiere, was wichtig ist, wenn die Reihenfolge der Dateien wichtig ist, d. H. Für Videoframes oder zeitabhängige Datenerfassung. Stellen Sie jedoch sicher, dass Ihre Dateinamen Indizes enthalten!

6
Daniel McGrath

Mit dieser Implementierung bin ich noch nicht ganz zufrieden. Ich wollte einen benutzerdefinierten Konstruktor haben, der DirectoryIndex._make(next(os.walk(input_path))) ausführt, sodass Sie nur den Pfad übergeben können, für den Sie eine Dateiliste erstellen möchten. Änderungen willkommen!

import collections
import os

DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files'])

for file_name in DirectoryIndex(*next(os.walk('.'))).files:
    file_path = os.path.join(path, file_name)
4
ThorSummoner

Seit Python 3.5 sind die Dinge viel einfacher mit os.scandir ( )

with os.scandir(path) as it:
    for entry in it:
        if entry.name.endswith(".asm") and entry.is_file():
            print(entry.name, entry.path)

Die Verwendung von scandir () anstelle von listdir () kann die Leistung von Code erheblich verbessern, der auch Dateityp- oder Dateiattributinformationen benötigt, da os.DirEntry-Objekte diese Informationen verfügbar machen, 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 normalerweise nur einen Systemaufruf für symbolische Verknüpfungen. os.DirEntry.stat () erfordert unter Unix immer einen Systemaufruf, unter Windows jedoch nur einen für symbolische Verknüpfungen.

3
crypdick

Sie können glob verwenden, um auf das Verzeichnis und die Liste zu verweisen:

import glob
import os

#to get the current working directory name
cwd = os.getcwd()
#Load the images from images folder.
for f in glob.glob('images\*.jpg'):   
    dir_name = get_dir_name(f)
    image_file_name = dir_name + '.jpg'
    #To print the file name with path (path will be in string)
    print (image_file_name)

Um die Liste aller Verzeichnisse im Array zu erhalten, können Sie os verwenden:

os.listdir(directory)
1
YAP

Ich verwende sehr gerne die Direktive scandir, die in die Bibliothek os integriert ist. Hier ist ein funktionierendes Beispiel:

import os

i = 0
with os.scandir('/usr/local/bin') as root_dir:
    for path in root_dir:
        if path.is_file():
            i += 1
            print(f"Full path is: {path} and just the name is: {path.name}")
print(f"{i} files scanned successfully.")
1
jamescampbell