Muszę iterować wszystkie .asm
pliki w danym katalogu i wykonywać na nich pewne działania.
Jak można to zrobić w efektywny sposób?
Oryginalna odpowiedź:
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
Wersja powyższej odpowiedzi w języku Python 3.6, używając os
- zakładając, że ścieżka katalogu jest str
obiektem w zmiennej o nazwie 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
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)
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
print(os.path.join(directory, filename))
należy go zmienićprint(os.path.join(directory_in_str, filename))
, aby działał w Pythonie 3.6for entry in os.scandir(path): print(entry.path)
if filename.endswith((".asm", ".py")):
, abyif filename.endswith(".asm") or filename.endswith(".py"):
Spowoduje to iterację wszystkich plików potomnych, nie tylko bezpośrednich potomków katalogu:
źródło
Możesz spróbować użyć modułu glob :
a od Python 3.5 możesz również przeszukiwać podkatalogi:
Z dokumentów:
źródło
Od wersji Python 3.5 rzeczy są znacznie łatwiejsze dzięki os.scandir ( )
źródło
entry
jest posix.DirEntry typu z wieloma przydatnych metod, takich jakentry.is_dir()
,is_file()
,is_symlink()
Python 3.4 i nowsze wersje oferują pathlib w standardowej bibliotece. Mógłbyś:
Lub jeśli nie lubisz wyrażeń z listy:
Path
obiekty można łatwo konwertować na ciągi.źródło
Oto jak iteruję pliki w Pythonie:
ŻADNA Z TEJ TECHNIKI NIE GWARANTUJE ŻADNEGO ZAMÓWIENIA ITERACYJNEGO
Tak, super nieprzewidywalny. Zauważ, że sortuję nazwy plików, co jest ważne, jeśli kolejność plików ma znaczenie, tj. Dla ramek wideo lub gromadzenia danych zależnych od czasu. Pamiętaj jednak o umieszczeniu indeksów w nazwach plików!
źródło
from pkg_resources import parse_version
ifilenames.sort(key=parse_version)
zrobił to.Możesz użyć glob do odwołania się do katalogu i listy:
Aby uzyskać listę wszystkich katalogów w tablicy, możesz użyć os :
źródło
Nie jestem jeszcze do końca zadowolony z tej implementacji. Chciałem mieć niestandardowego konstruktora, który robi
DirectoryIndex._make(next(os.walk(input_path)))
takie, że możesz po prostu podać ścieżkę, dla której chcesz mieć listę plików. Mile widziane zmiany!źródło
Naprawdę lubię korzystać z
scandir
dyrektywy wbudowanej wos
bibliotekę. Oto działający przykład:źródło