Python:os.stat()。st_size给出了与du不同的值

我正在创build一个实用程序,它将遍历目录并获取所有目录的子目录和文件的大小并存储值。 但是,大小不正确计算。

这是我的课程,通过所有的子目录自动recursion:

class directory: ''' Class that automatically traverses directories and builds a tree with size info ''' def __init__(self, path, parent=None): if path[-1] != '/': # Add trailing / self.path = path + '/' else: self.path = path self.size = 4096 self.parent = parent self.children = [] self.errors = [] for i in os.listdir(self.path): try: self.size += os.lstat(self.path + i).st_size if os.path.isdir(self.path + i) and not os.path.islink(self.path + i): a = directory(self.path + i, self) self.size += a.size self.children.append(a) except OSError: self.errors.append(path + i) 

我有一个video目录,我正在testing这个程序:

a =目录('/ var / media / television / The Wire')

a.size

45289964053

但是,当我尝试杜,我得到

〜#du -sx / var / media / television / The \ Wire

44228824

目录不包含任何链接或任何特殊的东西。

有人可以解释为什么os.stat()给出奇怪的大小读数?

平台:Linux(Fedora 13)Python 2.7

谢谢,

考虑这个文件foo

 -rw-rw-r-- 1 unutbu unutbu 25334 2010-10-31 12:55 foo 

它由25334个字节组成。

tune2fs告诉我foo驻留在一个块大小为4096字节的文件系统上:

 % sudo tune2fs -l /dev/mapper/vg1-OS1 ... Block size: 4096 ... 

因此,文件系统上的最小文件将占用4096字节,即使其内容仅由1个字节组成。 随着文件变大,空间被分配在4096字节块中。

杜报告

 % du -B1 foo 28672 foo 

请注意,28672/4096 = 7。这就是说,foo在文件系统上占用了7个4096字节的块。 这是保存25334字节所需的最小块数。

 % du foo 28 foo 

du这个版本只是报告28672/1024向下舍去。

du在默认情况下在磁盘上给出了大小,而在st_size给出了实际的文件大小。

 $ du test.txt 8 test.txt $ du -b test.txt 6095 test.txt >>> os.stat('test.txt').st_size 6095 

我会写这个代码为:

 import os, os.path def size_dir(d): file_walker = ( os.path.join(root, f) for root, _, files in os.walk(d) for f in files ) return sum(os.path.getsize(f) for f in file_walker) 

如果你想要将目录统计为4k,那么请执行如下操作:

 import os, os.path def size_dir(d): file_walker = ( os.path.join(root, f) for root, _, files in os.walk(d) for f in files ) dir_walker = ( 4096 for root, dirs, _ in os.walk(d) for d in dirs ) return 4096 + sum(os.path.getsize(f) for f in file_walker) + sum(size for size in dir_walker) 

在Linux上(我正在使用CentOS),'du -b'将以字节为单位返回,并将激活–apparent-size,从而返回文件的大小,而不是磁盘空间的大小。 试试看看是否与Python os.stat所说的一致。