为何文件大小与读取后bytes对象大小存在差异?附Python代码示例
为什么文件大小和读取后的bytes对象大小不一致?
这个问题核心是混淆了「文件在磁盘上的实际大小」和「Python对象在内存中的总占用量」两个完全不同的概念,我给你掰扯清楚:
1. 先搞懂两个函数的本质
os.path.getsize(filepath):这个函数返回的是文件在磁盘上存储的原始字节数,也就是文件内容的真实长度。比如你存了一行"hello world"的UTF-8编码文本文件,它返回的就是11,和文件内容的字节数完全一致。sys.getsizeof(contents):这个函数算的是整个Python bytes对象在内存中的总大小,而不只是它存储的文件内容的长度。因为bytes作为Python的内置对象,除了保存文件内容的字节,还需要额外的内存来存储对象的元信息——比如引用计数、类型标识、内部缓冲区的管理数据等等,这些都是对象的「额外开销」。
2. 举个实际例子
假设你有一个100字节的文件,运行你给出的代码:
import os import sys filepath = "test.txt" print(os.path.getsize(filepath)) # 输出:100 f = open(filepath,'rb') contents = f.read() print(sys.getsizeof(contents)) # 输出:比如149(具体数值取决于Python版本和操作系统)
这里第二个输出比100大,多出来的就是bytes对象本身的内存开销。
3. 如何获取内容的真实大小?
如果你想确认读取的内容和文件大小一致,应该用len(contents)——这个函数返回的是bytes对象里存储的字节数,也就是文件内容的真实长度,它会和os.path.getsize(filepath)的结果完全一致(只要读取过程中文件没被其他进程修改)。
修正后的代码可以这样写:
import os import sys filepath = "test.txt" # 磁盘上的文件大小 print(f"文件大小:{os.path.getsize(filepath)} 字节") with open(filepath, 'rb') as f: contents = f.read() # 读取内容的真实字节数 print(f"内容字节数:{len(contents)} 字节") # bytes对象在内存中的总占用 print(f"对象内存大小:{sys.getsizeof(contents)} 字节")
总结一下
- 要获取文件本身的大小,用
os.path.getsize() - 要获取读取内容的实际长度,用
len(contents) sys.getsizeof()是用来查看Python对象自身内存占用的,别用来当内容长度用~
内容的提问来源于stack exchange,提问作者user4936236
相关产品推荐
相关产品推荐

