Python 的 os.path.getsize() 是不是具有真正的字节分辨率?

Posted

技术标签:

【中文标题】Python 的 os.path.getsize() 是不是具有真正的字节分辨率?【英文标题】:Does Python's os.path.getsize() have true byte resolution?Python 的 os.path.getsize() 是否具有真正的字节分辨率? 【发布时间】:2018-06-13 16:17:08 【问题描述】:

文件系统很少允许文件长度为任意字节数,而是更喜欢填充它们以适应一定数量的块。 Python 的 os.path.getsize() 被记录为以字节为单位返回大小,但我不确定它是否被操作系统(在我的情况下是 linux)或文件系统四舍五入到块大小。对于我的应用程序,我必须知道能够从大文件 (~1GB) 中读取的确切字节数。对此有什么保证?

【问题讨论】:

这取决于您的文件系统。某些文件系统(如 procfs 和 sysfs)根本不会在统计数据中返回非零大小。如果你想要完全确定,打开文件,seek() 到最后,然后使用tell() 给你当前的偏移量。也就是说,对于用于常规(非生成、非虚拟、非套接字、非块设备)文件的常用文件系统上的常规文件,os.path.getsize() 将返回您要查找的内容。 【参考方案1】:

Python 不做任何保证。 os.path.getsize() 函数返回 st_size field of a os.stat() call。这是对stat system call 的直接调用。

stat 的所有文档都简单地将 st_size 命名为文件大小,以字节为单位。

在我的 Debian 测试系统上,stat 给出了真实的文件大小:

$ stat -fc %s .   # fs block size
4096
$ head -c 2048 < /dev/urandom > 2kb
$ head -c 6168 < /dev/urandom > 6kb
$ head -c 12345 < /dev/urandom > 12andabitkb
$ ls --block-size=1 -s *kb     # block use in bytes
16384 12andabitkb   4096 2kb   8192 6kb
$ ls --block-size=4K -s *kb    # block count per file
4 12andabitkb  1 2kb  2 6kb
$ python3 -c 'import os, glob; print(*(":<11 ".format(f, os.path.getsize(f)) for f in glob.glob("*kb")), sep="\n")'
2kb         2048
12andabitkb 12345
6kb         6168

【讨论】:

以上是关于Python 的 os.path.getsize() 是不是具有真正的字节分辨率?的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试使用 os.path.getsize 获取文件的大小,但它将大小打印为字节,我想以 MB 为单位打印出来,有啥解决方案吗?

python3获取文件及文件夹大小

python 获取文件和文件夹大小

Python_计算文件夹大小

03-os模块

大文件不断行切割