中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python怎么實現遍歷包含大量文件的文件夾

發布時間:2023-04-15 16:55:47 來源:億速云 閱讀:91 作者:iii 欄目:開發技術

本篇內容主要講解“Python怎么實現遍歷包含大量文件的文件夾”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python怎么實現遍歷包含大量文件的文件夾”吧!

在處理大模型的訓練數據時,經常需要遍歷大型文件夾,其中,可能包括數千萬或數億個文件,這時,一般的Python遍歷函數就會非常慢,例如os.walk、glob、path.rglob等等,同時,無法預估整體的遍歷時間。

Python怎么實現遍歷包含大量文件的文件夾

本文,通過Python的os.scandir,基于廣度優先搜索算法,實現可控、高效的遍歷文件,同時,輸出遍歷日志,支持后綴篩選,去除隱藏文件,實現遍歷包含大量文件的文件夾的功能。

os.scandir 是一個目錄迭代函數,返回 os.DirEntry 對象的迭代器,對應于由 path 指定目錄中的條目,這些條目以任意順序生成,不包括特殊條目 ‘.’ 和 ‘…’。os.scandir 的運行效率要高于 os.walk,在 PEP 471 中,Python 官方也推薦使用 os.scandir 遍歷目錄 。

源碼

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

輸出日志:

[Info] 初始化路徑開始!
[Info] 數據集路徑: /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] 

補充

除了上文的方式,小編還為大家整理了其他Python遍歷文件夾的方法,需要的可以參考一下

方法一:通過os.walk()遍歷,直接處理文件即可

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

方法二:通過pathlib.Path().rglob()遍歷,需要過濾出文件,速度較快。注意glob()不支持遞歸遍歷

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

到此,相信大家對“Python怎么實現遍歷包含大量文件的文件夾”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

旌德县| 安国市| 会昌县| 黄骅市| 长岛县| 余姚市| 夹江县| 镇远县| 瓮安县| 绥江县| 汕尾市| 武汉市| 长兴县| 鹤庆县| 安图县| 广河县| 老河口市| 西峡县| 集贤县| 和田县| 慈利县| 怀安县| 鄂州市| 宜兰县| 乌兰察布市| 西丰县| 阳西县| 镇安县| 金川县| 南郑县| 嘉义市| 吴堡县| 肃南| 兰西县| 庄河市| 义马市| 玉环县| 福建省| 会同县| 南乐县| 长春市|