Bei der Verarbeitung der Trainingsdaten eines großen Modells ist es häufig erforderlich, große Ordner zu durchlaufen, die Dutzende oder Hunderte Millionen Dateien enthalten können. Zu diesem Zeitpunkt ist die allgemeine Python-Traversalfunktion sehr langsam, z os.walk, glob, path.rglob usw. Gleichzeitig kann die Gesamtdurchlaufzeit nicht geschätzt werden.
Dieser Artikel verwendet Pythons os.scandir und basiert auf dem Breitensuchalgorithmus, um eine kontrollierbare und effiziente Durchquerung von Dateien zu erreichen und gleichzeitig , gibt das Durchlaufprotokoll aus, unterstützt die Suffixfilterung, entfernt versteckte Dateien und implementiert die Funktion zum Durchlaufen von Ordnern, die eine große Anzahl von Dateien enthalten.
os.scandir ist eine Verzeichnisiterationsfunktion, die einen Iterator von os.DirEntry-Objekten zurückgibt, die Einträgen im durch den Pfad angegebenen Verzeichnis entsprechen. Diese Einträge werden in beliebiger Reihenfolge generiert, mit Ausnahme spezieller Einträge. und ‘…’. Die Betriebseffizienz von os.scandir ist höher als die von os.walk. In PEP 471 empfehlen Python-Beamte auch die Verwendung von os.scandir zum Durchlaufen von Verzeichnissen.
Quellcode
def traverse_dir_files_for_large(root_dir, ext=""): """ 列出文件夹中的文件, 深度遍历 :param root_dir: 根目录 :param ext: 后缀名 :return: 文件路径列表 """ paths_list = [] dir_list = list() dir_list.append(root_dir) while len(dir_list) != 0: dir_path = dir_list.pop(0) dir_name = os.path.basename(dir_path) for i in tqdm(os.scandir(dir_path), f"[Info] dir {dir_name}"): path = i.path if path.startswith('.'): # 去除隐藏文件 continue if os.path.isdir(path): dir_list.append(path) else: if ext: # 根据后缀名搜索 if path.endswith(ext): paths_list.append(path) else: paths_list.append(path) return paths_list
Ausgabeprotokoll:
Supplementary[Info] Initialisierungspfad beginnt!# 🎜 🎜#[Info] Datensatzpfad: /alphafoldDB/pdb_from_uniprot
[Info] dir pdb_from_uniprot: 256it [00:10, 24.47it/s]
[Info] dir 00: 240753it [00:30 , 7808,36it/s]
[Info] dir 01: 241432it [00:24, 9975,56it/s]
[Info] dir 02: 240466it [00:24, 9809,68it/s] #🎜 🎜 #[Info] dir 03: 241236it [00:22, 10936.76it/s]
[Info] dir 04: 241278it [00:24, 10011.14it/s]
[Info] dir 05: 241348it [00:25, 9414.16it/s]
Zusätzlich zu den oben genannten Methoden auch der Editor bietet Ihnen Wir haben andere Python-Methoden zum Durchlaufen von Ordnern zusammengestellt. Wenn Sie sie benötigen, können Sie darauf zurückgreifen
Methode 1: Durchlaufen Sie os.walk() und verarbeiten Sie die Dateien direkt#🎜🎜 #
def traverse_dir_files(root_dir, ext=None, is_sorted=True): """ 列出文件夹中的文件, 深度遍历 :param root_dir: 根目录 :param ext: 后缀名 :param is_sorted: 是否排序,耗时较长 :return: [文件路径列表, 文件名称列表] """ names_list = [] paths_list = [] for parent, _, fileNames in os.walk(root_dir): for name in fileNames: if name.startswith('.'): # 去除隐藏文件 continue if ext: # 根据后缀名搜索 if name.endswith(tuple(ext)): names_list.append(name) paths_list.append(os.path.join(parent, name)) else: names_list.append(name) paths_list.append(os.path.join(parent, name)) if not names_list: # 文件夹为空 return paths_list, names_list if is_sorted: paths_list, names_list = sort_two_list(paths_list, names_list) return paths_list, names_list
def traverse_dir_files(root_dir, ext=None, is_sorted=True): """ 列出文件夹中的文件, 深度遍历 :param root_dir: 根目录 :param ext: 后缀名 :param is_sorted: 是否排序,耗时较长 :return: [文件路径列表, 文件名称列表] """ names_list = [] paths_list = [] for path in list(pathlib.Path(root_dir).rglob("*")): path = str(path) name = path.split("/")[-1] if name.startswith('.') or "." not in name: # 去除隐藏文件 continue if ext: # 根据后缀名搜索 if name.endswith(ext): names_list.append(name) paths_list.append(path) else: names_list.append(name) paths_list.append(path) if not names_list: # 文件夹为空 return paths_list, names_list if is_sorted: paths_list, names_list = sort_two_list(paths_list, names_list) return paths_list, names_list
Das obige ist der detaillierte Inhalt vonWie kann ich mit Python einen Ordner durchlaufen, der eine große Anzahl von Dateien enthält?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!