微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python:os.statst_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')

被阻止的系统调用不会让SIGKILL终止进程

如何重命名()没有竞争条件?

如何在Linux下为socket生成随机文件名?

我如何(成功)从命令行openSSL解码编码的密码

正确使用LD_LIBRARY_PATH或ldconfig作为软件包

a.size

45289964053

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

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

44228824

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

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

平台:Linux(Fedora 13)Python 2.7

谢谢,

| 在一行的开始 – bash

find两个文件间的差异最快的方法

PHPUnit(Linux)的问题 – PHP的致命错误

如何启动与gui没有监视器的Linux?

创build一个类似wacom的Linuxinput设备,用于使用触摸屏和笔

考虑这个文件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,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所说的一致。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐