Python 的 os.path.getsize() 是否具有真正的字节分辨率?
Does Python's os.path.getsize() have true byte resolution?
文件系统很少允许文件的字节数为任意长度,而是倾向于填充它们以适应一定数量的块。 Python 的 os.path.getsize() 被记录为 return 以字节为单位的大小,但我不确定它是否被 OS (linux,在我的例子中)或文件系统,到块大小。对于我的应用程序,我有必要知道我能够从大文件 (~1GB) 中读取的确切字节数。这有什么保证?
Python 不作任何保证。 os.path.getsize()
函数returnsst_size
field of a os.stat()
call. This is a direct call to the 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() 被记录为 return 以字节为单位的大小,但我不确定它是否被 OS (linux,在我的例子中)或文件系统,到块大小。对于我的应用程序,我有必要知道我能够从大文件 (~1GB) 中读取的确切字节数。这有什么保证?
Python 不作任何保证。 os.path.getsize()
函数returnsst_size
field of a os.stat()
call. This is a direct call to the 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