最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)遍歷包含大量文件的文件夾

 更新時(shí)間:2023年04月13日 10:36:46   作者:SpikeKing  
在處理大模型的訓(xùn)練數(shù)據(jù)時(shí),經(jīng)常需要遍歷大型文件夾,其中,可能包括數(shù)千萬或數(shù)億個(gè)文件,所以本文為大家整理了Python遍歷包含大量文件的文件夾的方法,希望對大家有所幫助

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

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

os.scandir 是一個(gè)目錄迭代函數(shù),返回 os.DirEntry 對象的迭代器,對應(yīng)于由 path 指定目錄中的條目,這些條目以任意順序生成,不包括特殊條目 ‘.’ 和 ‘…’。os.scandir 的運(yùn)行效率要高于 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:  # 根據(jù)后綴名搜索
                    if path.endswith(ext):
                        paths_list.append(path)
                else:
                    paths_list.append(path)
    return paths_list

輸出日志:

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

補(bǔ)充

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

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

def traverse_dir_files(root_dir, ext=None, is_sorted=True):
    """
    列出文件夾中的文件, 深度遍歷
    :param root_dir: 根目錄
    :param ext: 后綴名
    :param is_sorted: 是否排序,耗時(shí)較長
    :return: [文件路徑列表, 文件名稱列表]
    """
    names_list = []
    paths_list = []
    for parent, _, fileNames in os.walk(root_dir):
        for name in fileNames:
            if name.startswith('.'):  # 去除隱藏文件
                continue
            if ext:  # 根據(jù)后綴名搜索
                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: 是否排序,耗時(shí)較長
    :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:  # 根據(jù)后綴名搜索
            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

到此這篇關(guān)于Python實(shí)現(xiàn)遍歷包含大量文件的文件夾的文章就介紹到這了,更多相關(guān)Python遍歷文件夾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python使用PyQt5/PySide2編寫一個(gè)極簡的音樂播放器功能

    Python使用PyQt5/PySide2編寫一個(gè)極簡的音樂播放器功能

    這篇文章主要介紹了Python中使用PyQt5/PySide2編寫一個(gè)極簡的音樂播放器功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 詳解如何使用Python實(shí)現(xiàn)復(fù)制粘貼的功能

    詳解如何使用Python實(shí)現(xiàn)復(fù)制粘貼的功能

    pandas?里面有一個(gè)?pd.read_clipboard?函數(shù),可以根據(jù)你復(fù)制的內(nèi)容生成DataFrame。本文就利用這個(gè)函數(shù)實(shí)現(xiàn)復(fù)制粘貼的功能,感興趣的可以了解一下
    2023-01-01
  • matplotlib繪制兩點(diǎn)間連線的幾種方法實(shí)現(xiàn)

    matplotlib繪制兩點(diǎn)間連線的幾種方法實(shí)現(xiàn)

    本文主要介紹了matplotlib繪制兩點(diǎn)間連線的幾種方法實(shí)現(xiàn),主要介紹了4種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 在pycharm中使用git版本管理以及同步github的方法

    在pycharm中使用git版本管理以及同步github的方法

    今天小編就為大家分享一篇在pycharm中使用git版本管理以及同步github的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python人工智能TensorFlow自定義層及模型保存

    python人工智能TensorFlow自定義層及模型保存

    這篇文章主要為大家介紹了python人工智能TensorFlow自定義層及模型保存示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • 教你怎么用Python selenium操作瀏覽器對象的基礎(chǔ)API

    教你怎么用Python selenium操作瀏覽器對象的基礎(chǔ)API

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著怎么用Python selenium操作瀏覽器對象的基礎(chǔ)API展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Window10下python3.7 安裝與卸載教程圖解

    Window10下python3.7 安裝與卸載教程圖解

    本文通過圖文并茂的形式給大家介紹了WINDOW10下PYTHON3.7 安裝與卸載,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • python中的opencv?圖像分割與提取

    python中的opencv?圖像分割與提取

    這篇文章主要介紹了python中的opencv?圖像分割與提取,圖像中將前景對象作為目標(biāo)圖像分割或者提取出來。對背景本身并無興趣分水嶺算法及GrabCut算法對圖像進(jìn)行分割及提取。具體實(shí)現(xiàn)過程需要的朋友可以參考下面文章詳細(xì)介紹
    2022-06-06
  • python的scikit-learn將特征轉(zhuǎn)成one-hot特征的方法

    python的scikit-learn將特征轉(zhuǎn)成one-hot特征的方法

    今天小編就為大家分享一篇python的scikit-learn將特征轉(zhuǎn)成one-hot特征的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python中MySQL數(shù)據(jù)遷移到MongoDB腳本的方法

    Python中MySQL數(shù)據(jù)遷移到MongoDB腳本的方法

    MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。本文給大家介紹Python中MySQL數(shù)據(jù)遷移到MongoDB腳本的方法,需要的朋友參考下
    2016-04-04

最新評論

清新县| 景德镇市| 塔河县| 逊克县| 巫山县| 瓮安县| 景德镇市| 博罗县| 商南县| 旬邑县| 乐都县| 望都县| 棋牌| 朝阳县| 娄烦县| 墨脱县| 湖南省| 山西省| 汉源县| 兴山县| 霍城县| 台南市| 屯门区| 电白县| 古田县| 固原市| 古丈县| 石嘴山市| 什邡市| 阿克苏市| 高碑店市| 青神县| 庆安县| 永新县| 边坝县| 赣榆县| 临沧市| 磐石市| 邵东县| 巫山县| 江安县|