为什么sys.getsizeof与os.path.getsize不相等?

3
这个问题可能看起来很傻,但我有一个/tmp/size.txt文件,它的内容如下:
hello

当我执行以下命令时:os.path.getsize('/tmp/size.txt')返回6,但实际上文件大小不是6。

sys.getsizeof(b'hello')
# OR
sys.getsizeof(bytes(bytearray('hello')))
# OR
sys.getsizeof(bytes('hello'))

它返回 42

os.path.getsizesys.getsizeof 之间有什么区别?


1
getsizeo() 返回对象查询在内存中的大小,包括结构开销。它通常比该对象中存储的数据更大。在您的情况下,使用 len() 更有帮助。 - Klaus D.
2个回答

7

在Python中,os.path.getsize用于获取文件的大小,而sys.getsizeof则用于获取对象的大小。两者不兼容。

由于换行符的存在,文件实际上是6个字节,而非5个字节(在Windows上可能会是7个字节)。如果使用C语言,“hello”将是6个字节,因为二进制零'\0'表示字符串的结尾。如果使用其他语言,则也会有自己的内存开销。

数据占用的内存(通常)比对象占用的内存少。对象还包括关于数据的其他信息,如其大小和位置。这是使用高级语言所付出的代价。


我该如何找到内存中对象的文件大小?比如一个bytearray。 - Afshin Mehrabani
好的,那么使用len(variable-name)。但是不要忘记,除非您以二进制方式打开文件,否则可能会添加行末标志符(取决于如何写入文件)。 - cdarke
我明白了,这就是我想到的解决方案。还有一个问题,这个解决方案支持不同的编码方式,比如UTF8吗? - Afshin Mehrabani
在bytearray中不能轻易地存储多字节字符。len()函数用于字符串时返回字符数,用于bytes或bytearray对象时返回的是字节数。 - cdarke
请参见https://dev59.com/N2w15IYBdhLWcg3wSJs3。 - cdarke
显示剩余5条评论

0

os.path.getsize 返回文件的大小(以字节为单位)。

sys.getsizeof 返回存储str / bytes对象所需的字节数(由于结构数据存在开销,因此实际内容与之相差一些)。


好的,我该如何找到内存中对象的文件大小?比如一个bytearray。 - Afshin Mehrabani
sys.getsizeof会返回对象占用的内存量。 - Dean Fenster
在内存中,询问一个对象的“文件大小”并没有太多意义。这取决于你如何在内存中存储对象以及如何将其存储在文件中,两者可能不同。你可以询问对象中存储的数据大小 - 如果可以测量,那么可能会有一个答案... - kratenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接