Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich mit Python einen Ordner durchlaufen, der eine große Anzahl von Dateien enthält?

Wie kann ich mit Python einen Ordner durchlaufen, der eine große Anzahl von Dateien enthält?

WBOY
WBOYnach vorne
2023-04-25 15:22:081188Durchsuche

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.

Wie kann ich mit Python einen Ordner durchlaufen, der eine große Anzahl von Dateien enthält?

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:

[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]

Supplementary

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
Methode 2: Durchlaufen Sie pathlib.Path().rglob(), Sie müssen die Dateien herausfiltern, was schneller ist. Beachten Sie, dass glob() keine rekursive Durchquerung

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
unterstützt

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen