当前位置: 首页 > 面试题库 >

快速获取文件夹的总大小

商华藏
2023-03-14
问题内容

我想使用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不是您的朋友。从而,

  1. os.walk 首次通话os.listdir(内部通话FindFirstFile/ FindNextFile
    • 从此以后进行的任何其他系统调用只会使您 比Windows资源管理器
  2. os.walk 然后调用isdir返回的每个文件os.listdir(在内部调用GetFileAttributesEx-或在Win2k之前调用GetFileAttributes+FindFirstFile组合)以重新确定是否递归
  3. os.walkos.listdir将执行 额外的内存分配 ,串和阵列操作等填写它们的返回值
  4. 然后getsize,您需要 调用 返回的每个文件os.walk再次 调用GetFileAttributesEx

与Windows资源管理器相比,每个文件的系统调用多3倍,外加内存分配和操作开销。

您可以使用Anurag的解决方案,也可以尝试直接FindFirstFile/FindNextFile递归调用/
(应该与acygwin或其他win32端口
的性能相当du -s some_directory)。

请参阅os.py的实施os.walkposixmodule.c为实施listdirwin32_stat(双方调用isdirgetsize。)

请注意, 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