在處理大模型的訓練資料時,經常需要遍歷大型資料夾,其中,可能包括數千萬或數億個文件,這時,一般的Python遍歷函數就會非常慢,例如os.walk、 glob、path.rglob等等,同時,無法預估整體的遍歷時間。
本文,透過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/soo[ 01: 241432it [00:24, 9975.56it/s]
[Info] dir 02: 240466it [00:24, 9809.68it/s]
[Info] dir 03: 241236. /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
以上是如何使用Python遍歷一個包含大量檔案的資料夾?的詳細內容。更多資訊請關注PHP中文網其他相關文章!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