Hoe kan ik bestanden in een bepaalde map herhalen?

Ik moet alle .asm-bestanden in een bepaalde map doorlopen en er enkele acties op uitvoeren.

Hoe kan dit op een efficiënte manier worden gedaan?


Antwoord 1, autoriteit 100%

Oorspronkelijke antwoord:

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-versie van het bovenstaande antwoord, met behulp van os– ervan uitgaande dat je het directorypad hebt als een str-object in een variabele met de naam 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

Of recursief, met behulp van 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)
  • Gebruik rglobom glob('**/*.asm')te vervangen door rglob('*.asm')
    • Dit is hetzelfde als het aanroepen van Path.glob()met '**/'toegevoegd voor het gegeven relatieve patroon:
from pathlib import Path
pathlist = Path(directory_in_str).rglob('*.asm')
for path in pathlist:
     # because path is object not string
     path_in_str = str(path)
     # print(path_in_str)

Antwoord 2, autoriteit 18%

Dit herhaalt alle onderliggende bestanden, niet alleen de directe onderliggende bestanden van de map:

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)

Antwoord 3, autoriteit 15%

U kunt de module globgebruiken:

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

en sinds Python 3.5 kun je ook in submappen zoeken:

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

Uit de documenten:

De glob-module vindt alle padnamen die overeenkomen met een gespecificeerd patroon volgens de regels die worden gebruikt door de Unix-shell, hoewel de resultaten in willekeurige volgorde worden geretourneerd. Er wordt geen tilde-uitbreiding uitgevoerd, maar *, ?, en tekenreeksen uitgedrukt met [] zullen correct overeenkomen.


Antwoord 4, autoriteit 4%

Sinds Python 3.5 is alles veel eenvoudiger met os.scandir() en 2-20x sneller (bron):

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

Het gebruik van scandir() in plaats van listdir() kan de
prestatie van code waarvoor ook een bestandstype of bestandskenmerk nodig is
informatie, omdat os.DirEntry-objecten deze informatie weergeven als:
het besturingssysteem levert het bij het scannen van een map. Alle
os.DirEntry-methoden kunnen een systeemaanroep uitvoeren, maar is_dir() en
is_file() vereist meestal alleen een systeemaanroep voor symbolische links;
os.DirEntry.stat() vereist altijd een systeemaanroep op Unix, maar alleen
vereist een voor symbolische links op Windows.


Antwoord 5, autoriteit 2%

Python 3.4 en hoger bieden pathlibin de standaardbibliotheek. Je zou kunnen doen:

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

Of als je niet van lijstbegrippen houdt:

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

Path-objecten kunnen eenvoudig worden geconverteerd naar tekenreeksen.


Antwoord 6

Zo ga ik door bestanden 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

GEEN VAN DEZE TECHNIEKEN GARANDEERT ITERATIES BESTELLEN

Ja, super onvoorspelbaar. Merk op dat ik de bestandsnamen sorteer, wat belangrijk is als de volgorde van de bestanden van belang is, d.w.z. voor videoframes of tijdsafhankelijke gegevensverzameling. Zorg ervoor dat u indices in uw bestandsnamen plaatst!


Antwoord 7

U kunt globgebruiken om de directory en de lijst te verwijzen:

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)

Om de lijst met alle mappen in een array te krijgen, kun je osgebruiken:

os.listdir(directory)

Antwoord 8

Ik ben nog niet helemaal tevreden met deze implementatie, ik wilde een aangepaste constructor hebben die DirectoryIndex._make(next(os.walk(input_path)))doet, zodat je gewoon kunt passeren het pad waarvoor u een bestandslijst wilt. Bewerkingen welkom!

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)

Antwoord 9

Ik gebruik graag de scandir-richtlijn die is ingebouwd in de os-bibliotheek. Hier is een werkend voorbeeld:

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.")

Other episodes