2013-10-07 59 views
4

差异您好StackOverflow伙计, 长期阅读器,第一次海报。希望我已经得到了所有的信息来提出一个有用的问题。看起来shutil.disk_usage()

我正在使用shutil.disk_usage()函数来查找特定路径(可用量,已用量等)的当前磁盘使用情况。据我所知,这是os.statvfs()调用的一个包装。与Linux中“du”的输出相比,我发现它没有给出我期望的答案。

为了保护公司隐私的原因,我已经隐藏了一些路径,但输出和代码被否决。我正在使用Python 3.3.2 64位版本。

#!/apps/python/3.3.2_64bit/bin/python3 

# test of shutils.diskusage module 
import shutil 

BytesPerGB = 1024 * 1024 * 1024 

(total, used, free) = shutil.disk_usage("/data/foo/") 
print ("Total: %.2fGB" % (float(total)/BytesPerGB)) 
print ("Used: %.2fGB" % (float(used)/BytesPerGB)) 

(total1, used1, free1) = shutil.disk_usage("/data/foo/utils/") 
print ("Total: %.2fGB" % (float(total1)/BytesPerGB)) 
print ("Used: %.2fGB" % (float(used1)/BytesPerGB)) 

,输出:

/data/foo/drivecode/me % disk_usage_test.py 
Total: 609.60GB 
Used: 291.58GB 
Total: 609.60GB 
Used: 291.58GB 

正如你可以看到,主要的问题是我所期望的“二手”要小的多的第二量,因为它是第一个目录的一个子集。

/data/foo/drivecode/me % du -sh /data/foo/utils 
2.0G /data/foo/utils 

尽管我信任“du”,但我发现很难相信Python模块也不正确。所以也许这只是我对Linux文件系统的理解,可能是问题所在。 :)

我写了一个模块(很大程度上基于某人在这里的代码)递归获取disk_usage,我一直在使用它。它看起来与“du”输出相匹配,但是比shutil.disk_usage()函数慢得多,所以我希望我可以让它工作。

非常感谢。

+2

功能'shutil.disk_usage'是给你的“盘”不使用“目录”的用法。你从它得到的东西应该与'df -h'而不是'du -sh'进行比较。 – crayzeewulf

回答

5

问题是,shutil使用下面的系统调用statvfs来确定使用的空间。就我所知,此系统调用没有文件路径粒度,只有文件系统粒度。这意味着您提供的路径仅有助于识别要查询的文件系统,而不是路径。

换句话说,你给它的路径/data/foo/utils然后它确定哪个文件系统支持这个文件路径。然后它查询文件系统。当你考虑到used参数是如何在shutil定义这将很明显:

used = (st.f_blocks - st.f_bfree) * st.f_frsize 

其中:

fsblkcnt_t  f_blocks; /* size of fs in f_frsize units */ 
fsblkcnt_t  f_bfree; /* # free blocks */ 
unsigned long f_frsize; /* fragment size */ 

这就是为什么它给你的整个文件系统上使用的空间。

事实上,在我看来,du命令本身也会遍历文件结构并累加文件大小。这里是GNU coreutils du命令的source code

4

shutil.disk_usage返回该路径下的磁盘使用情况(即支持路径的挂载点),而不是实际的文件使用情况。它相当于运行df /path/to/mount而不是du /path/to/files。请注意,对于这两个目录你都有完全相同的用法。

从文档:"Return disk usage statistics about the given path as a named tuple with the attributes total, used and free, which are the amount of total, used and free space, in bytes."

+0

谢谢。那么我想问题是,是否有一个Python函数更类似于路径下的文件使用情况?如果没有内置的东西,我可以使用os.walk()。这一切都解释了为什么“du”和Python等效速度如此之快,也许目录结构已经包含了这些信息(我在这里猜测),它只是将它解析出来。为了获得文件的使用,我需要抓取整个路径和子目录并添加文件大小。 –

+0

的确,除了手动计算每个文件外,没有办法对文件使用的空间量进行求和。 看看这些链接,他们可能会帮助你: http://stackoverflow.com/questions/12480367/how-to-generate-directory-size-recursively-in-python-like-du-does 也,请注意,您必须收集大小以获得与du相同的数字: http://stackoverflow.com/questions/4080254/python-os-stat-st-size-gives-different - 值高于杜 – micromoses