You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何文件大小与读取后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:33:25