Jak mogę iterować nad plikami w danym katalogu?

Muszę przejrzeć wszystkie .asm pliki w danym katalogu i wykonać na nich pewne czynności.

Jak można to zrobić w skuteczny sposób?

Author: Alan W. Smith, 2012-04-30

6 answers

Oryginalna odpowiedź:

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

Python w wersji 3.6 powyższej odpowiedzi, za pomocą os - zakładając, że masz ścieżkę katalogu jako obiekt str w zmiennej o nazwie directory_in_str:

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

Lub rekurencyjnie, używając 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)
 451
Author: anselm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-08 02:13:56

Możesz spróbować użyć glob module

import glob

for filepath in glob.iglob('my_dir/*.asm'):
    print(filepath)
 87
Author: Doboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 10:31:34

Będzie to iterować nad wszystkimi plikami potomnymi, a nie tylko bezpośrednimi dziećmi katalogu:

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)
 78
Author: pedromateo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-26 15:13:41

Python 3.4 i nowsze oferują pathlib w bibliotece standardowej. Można zrobić:

from pathlib import Path

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

Lub jeśli nie podoba Ci się składanie listy:

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

Path obiekty mogą być łatwo konwertowane na ciągi znaków.

 8
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-26 14:41:27

Nie jestem do końca zadowolony z tej implementacji, chciałem mieć własny konstruktor, który robi DirectoryIndex._make(next(os.walk(input_path))) tak, że możesz po prostu przekazać ścieżkę, dla której chcesz listę plików. Edycje mile widziane!

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)
 2
Author: ThorSummoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 15:49:27

Oto jak przeglądam pliki w Pythonie:

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

ŻADNA Z TYCH TECHNIK NIE GWARANTUJE ZAMAWIANIA ITERACJI

Tak, super nieprzewidywalny. Zauważ, że sortuję nazwy plików, co jest ważne, jeśli liczy się kolejność plików, tj. dla klatek wideo lub gromadzenia danych zależnych od czasu. Pamiętaj jednak, aby umieścić indeksy w nazwach plików!
 0
Author: Daniel McGrath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 21:34:08