如何提取Pandas DataFrame人类可读格式的内存占用字符串
问题
现有如下测试DataFrame:
import pandas as pd df = pd.DataFrame({'A': range(1, 10000)})
- 调用
df.info()可以得到友好的人类可读输出,显示该对象内存占用为78.2 KB,输出示例如下:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 9999 entries, 0 to 9998 Data columns (total 1 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 A 9999 non-null int64 dtypes: int64(1) memory usage: 78.2 KB
- 调用
df.memory_usage()只能得到原始字节数值,结果可读性差,这也是Pandas计算内存占用的底层实现逻辑,我不希望自行编写字节到可读存储单位的转换逻辑。 - 我追踪过
df.info的源码,找到了格式化内存字符串的生成位置,但不清楚该字符串具体的生成逻辑,也不知道如何直接提取该字符串用于日志打印。 - 我无法直接解析
df.info()的输出内容,因为该方法会直接将内容打印到缓冲区,对其调用str()只会返回None。另外源码中仅能找到控制是否打印内存占用的布尔标记,无法直接获取格式化结果。
答案
你不需要自行实现字节单位转换逻辑,也不用通过重定向标准输出的方式强行抓取控制台内容,有两种稳定的实现方案:
方法1:利用buf参数捕获info输出
df.info()原生提供了buf参数用来指定输出的目标流,你可以传入内存中的StringIO对象接收所有输出内容,全程不会向控制台打印任何内容,之后直接提取内存占用对应的行即可:
from io import StringIO buf = StringIO() df.info(buf=buf) info_content = buf.getvalue() # 提取内存占用字符串 memory_str = [line for line in info_content.splitlines() if line.startswith("memory usage:")][0]
这个方案完全基于Pandas的公开API实现,没有跨版本兼容风险,如果你同时需要info输出的其他字段信息,也可以直接从捕获的文本中提取。
方法2:直接复用Pandas内置的格式化函数
df.info()底层将字节数转换为可读单位的逻辑封装在sizeof_fmt函数中,你可以直接导入这个函数使用,输出结果和info打印的内容完全一致:
from pandas.io.formats.format import sizeof_fmt # 计算总内存字节数,传入deep=True确保准确计算对象类型占用的内存 total_bytes = df.memory_usage(deep=True).sum() memory_str = f"memory usage: {sizeof_fmt(total_bytes)}"
这个方案更轻量,适合只需要单独获取内存占用字符串、不需要完整info输出的日志场景。
内容的提问来源于stack exchange,提问作者ifly6
相关产品推荐
相关产品推荐

