python Mac OS:OS.path.getsize返回的值与du-ks不同?

python Mac OS:OS.path.getsize返回的值与du-ks不同?,python,macos,directory,os.walk,du,Python,Macos,Directory,Os.walk,Du,当将目录的大小与Unix和python进行比较时,我得到了稍微不同的结果(使用“磁盘使用率”时小5%)。为什么? (我的所有子文件夹都可读;我在Mac OSX Mountain lion下工作,python版本2.7.2) 这是我的密码: import os, sys from commands import getstatusoutput def get_size(start_path = '.'): total_size = 0 for dirpath, dirnames,

当将目录的大小与Unix和python进行比较时,我得到了稍微不同的结果(使用“磁盘使用率”时小5%)。为什么? (我的所有子文件夹都可读;我在Mac OSX Mountain lion下工作,python版本2.7.2)

这是我的密码:

import os, sys
from commands import getstatusoutput

def get_size(start_path = '.'):
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(start_path):
        for f in filenames:
            fp = os.path.join(dirpath, f)
            total_size += os.path.getsize(fp)
    return total_size/1024

def get_size2(start_path = '.'):
    cmd = "du -ks "+start_path    # result in blocks of 1024 bytes
    code_err, output = getstatusoutput(cmd)
    return int(output.split()[0])

print get_size()
# 306789
print get_size2()
# 321328
提前感谢您的回答


Eric.

一般来说,
du
提供数据在磁盘上占用的存储量,而许多其他测量数据的方法将提供数据的大小

为什么这不一样

  • 有时,数据可以非常高效地存储,并且需要的存储空间比原始大小小。如果您有稀疏文件或硬链接,则可能发生这种情况。虽然这两种方法在Unix*ish文件系统上很常见,但根据文件系统的古怪程度,可能还有其他方法
  • 有时,数据在磁盘上需要的空间比原来的大。这是很正常的,因为所有文件系统都以块的形式对其文件数据进行排序,并且数据并不总是以块大小的倍数出现。这意味着最后一个块的某些部分通常被浪费(即被占用但未被使用)

对字节大小求和并除以1024与得到所使用的1024个块的总数不同(假设有1024个文件,每个字节等于1个块,但实际上每个文件使用1024个块,因此实际使用的空间为1024^2)。尝试修改
getsize
以计算每个文件使用的1024个块的数量,结果应相同。样式注意:
命令
模块已弃用。在您的情况下,您应该真正使用
子流程。检查输出是否正确。我猜我的机器块大小是4096,si I将行total_size+=替换为total_size+=(os.path.getsize(fp)+4096)/4096*4\n\n某些目录的结果相同,但其他目录的结果仍然稍低(此处:316140)