快速获取文件夹的总大小
我想使用python快速找到任何文件夹的总大小。
import osfrom os.path import join, getsize, isfile, isdir, splitext
def GetFolderSize(path):
TotalSize = 0
for item in os.walk(path):
for file in item[2]:
try:
TotalSize = TotalSize + getsize(join(item[0], file))
except:
print("error with file: " + join(item[0], file))
return TotalSize
print(float(GetFolderSize("C:\\")) /1024 /1024 /1024)
这是我编写的用于获取文件夹总大小的简单脚本,大约花费了60秒(+ -5秒)。通过使用多处理,我在四核计算机上将其缩短到23秒。
使用Windows文件浏览器仅需约3秒钟(右键单击->属性即可自行查看)。那么,有没有一种更快的方法来找到文件夹的总大小,使其接近Windows可以达到的速度?
Windows 7,python 2.6(搜索,但大多数时候人们使用与我自己非常相似的方法)预先感谢。
回答:
你处于不利地位。
Windows资源管理器几乎可以肯定地使用FindFirstFile
/FindNextFile
遍历目录结构
并lpFindFileData
一次通过(通过)收集大小信息,从而使每个文件实质上是一个系统调用。
不幸的是,在这种情况下,Python不是您的朋友。从而,
os.walk
(内部通话FindFirstFile
/FindNextFile
)- 比Windows资源管理器
os.walk
返回的每个文件os.listdir
(在内部调用GetFileAttributesEx
-或在Win2k之前调用GetFileAttributes
+FindFirstFile
组合)以重新确定是否递归os.walk
和os.listdir
将执行 ,串和阵列操作等填写它们的返回值- ,您需要 返回的每个文件
os.walk
( 调用GetFileAttributesEx
)
与Windows资源管理器相比,每个文件的系统调用多3倍,外加内存分配和操作开销。
您可以使用Anurag的解决方案,也可以尝试直接FindFirstFile
/FindNextFile
递归调用/
(应该与acygwin
或其他win32端口
的性能相当du -s some_directory
)。
请参阅os.py
的实施os.walk
,posixmodule.c
为实施listdir
和win32_stat
(双方调用isdir
和getsize
。)
请注意, (Windows和 nices) 上 ,Python 在所有版本
(包括Python3.1)以下 都是次优的 。在Windows和
nices上os.walk
都可以通过遍历而无需调用,isdir
因为FindFirst
/
FindNext
(Windows)和opendir
/ readdir
(
nix)已经通过lpFindFileData->dwFileAttributes
(Windows)和dirent::d_type
(
nix)返回了文件类型。
可能违反直觉,在大多数现代配置(例如Win7和NTFS,甚至某些SMB实现)GetFileAttributesEx
上
其速度FindFirstFile
是单个文件的 (可能比。遍历目录还要慢FindNextFile
)。
Python 3.5包括新的PEP 471
os.scandir()
函数,该函数通过返回文件属性和文件名来解决此问题。此新功能用于加快内置速度os.walk()
(在Windows和Linux上)。您可以在PyPI上使用scandir模块来获得针对旧版Python版本(包括2.x)的此行为。
以上是 快速获取文件夹的总大小 的全部内容, 来源链接: utcz.com/qa/421835.html