我想使用python快速找到任何文件夹的总大小。
import os
from 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
首次通话os.listdir
(内部通话FindFirstFile
/ FindNextFile
)
os.walk
然后调用isdir
返回的每个文件os.listdir
(在内部调用GetFileAttributesEx
-或在Win2k之前调用GetFileAttributes
+FindFirstFile
组合)以重新确定是否递归os.walk
和os.listdir
将执行 额外的内存分配 ,串和阵列操作等填写它们的返回值getsize
,您需要 调用 返回的每个文件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
。)
请注意, os.walk
在所有平台(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)的此行为。
问题内容: 如何在Java中检索文件夹或文件的大小? 问题答案: 如果文件不存在,则以字节为单位返回文件的长度。没有内置的方法来获取文件夹的大小,你将不得不递归遍历目录树(使用代表目录的文件对象的方法)并为自己积累目录大小: 警告:此方法不足以用于生产。可能返回并导致。另外,它不考虑符号链接,并且可能具有其他故障模式。
我刚从Eclipse搬到Android Studio,我发现当我使用快速文档(CtrlQ)时,它总是显示“获取文档”。 我怎样才能解决这个问题?我下载了API 19的文档,但问题依然存在。
windows 如何快速查看某个文件夹的大小? 查看文件夹属性太慢了
问题内容: 我在解析Mac上的别名链接时遇到问题。我正在检查文件是否是别名,然后我想接收原始路径。相反,我只得到一个文件ID。安莉的想法? 编辑: 两个答案都是正确的!我之所以选择mklement0的答案,是因为最初没有说明该代码必须在10.9上运行,从而使其更加灵活 问题答案: 这是 在OS X 10.9上也可以 使用的 实现 : 注意: 与vadian的解决方案不同,即使对于 非 别名文件,这
问题内容: 我需要一个非常大的mmap文件的无拷贝调整大小,同时仍然允许并发访问读取器线程。 一种简单的方法是在同一进程中在同一文件上使用两个MAP_SHARED映射(增长文件,然后创建第二个映射,其中包括增长的区域),然后在所有可访问该文件的读取器完成操作后取消映射旧映射。但是,我很好奇下面的方案是否可行,如果可行,是否有任何好处。 使用MAP_PRIVATE映射文件 对多个线程进行只读访问 要
我想获取文件夹大小并重命名它,如果我的文件夹大小超过500 mbs然后重命名文件夹,下载到MusicDownload