我正在尝试确定
pathlib
模块是否比目录遍历方面的 os
有所改进。令我惊讶的是,与 os
相比,我从 pathlib
模块获得了更好的读数。这是我没想到的。是否因为 os
模块足够愚蠢,不关心路径字符串是否代表文件、目录或链接等?那么速度与更好的控制?
也许我没有使用
pathlib
应该使用的方式。
这是代码:
import os
import sys
import pathlib
import time
import pdb
def TraverseDir(path=None, oswalk=None):
if path is None:
path = pathlib.Path().home()
oswalk = True if (oswalk == 'True') else False
if (oswalk == True):
method = "oswalk"
else:
method = "Pathlib"
start = time.time()
count = 0
with open("filelist" + '_' + method, "w+") as file:
if (oswalk):
for ( _, _,fnames) in os.walk(path):
for fname in fnames:
count += 1
file.write(fname + '\n')
continue
else:
for Fullpath in pathlib.Path(path).rglob("*"):
if Fullpath.is_file():
count += 1
file.write(str(Fullpath.name) + '\n')
continue
end = time.time()
print(f"Took {end - start} seconds with {method}, counted {count} files")
if __name__ == '__main__':
try:
path = sys.argv[1]
if ((path.lower() == 'true') or (path.lower() == 'false')):
oswalk = path
path = None
else:
oswalk = sys.argv[2]
except IndexError:
path = None
oswalk = None
TraverseDir(path, oswalk)
这是
pathlib
用于遍历目录树的最佳方式吗?请阐明这一点。
更新1:现在我知道
pathlib
不是os
的竞争对手(可以这么说),而是一种恭维,将在需要时将它们混合在一起。
应该显而易见的部分是,pathlib 正在创建路径对象,这需要时间,而 os.walk 只返回字符串。
创建
Path
对象很慢,但在您的情况下让它变慢的是 Fullpath.is_file()
。
如果运行分析,在文件夹中递归迭代文件时,仅此部分就需要花费 60% 以上的时间。