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

为何pandas .to_csv()导出的CSV文件大小远超预期?

问题:CSV导出文件大小远大于二进制预期的原因及pandas.to_csv()工作机制

问题背景

我有一组电压随时间变化的数据集,包含32MSamples(32×1024×1024),每个样本含16位电压值和64位时间值,将其存储为pandas DataFrame(32×1024×1024行、2列)。使用.to_csv()导出后,CSV文件大小达1.5GB,但按二进制计算总大小预期应为320MB,相差约5倍。

补充代码细节:

N_SAMPLES = 32 * 1024 * 1024

DATA为存储16位电压值的列表,通过np.linspace(0,DURATION,num=N_SAMPLES)生成np.float64类型的时间数组t,构建字典并生成DataFrame后导出:

data = {
"Time [s]": t,
"Output [V]": DATA
}
dataFrame = pd.DataFrame(data)
dataFrame.to_csv('output.csv', mode='w')

差异原因

  • 存储格式本质差异:二进制是直接存储原始字节(比如float64占8字节、16位整数占2字节),而CSV是纯文本格式——每个数值都要转换成字符串字符存储。比如你的float64时间值,转成可读字符串可能需要10-20个字符(比如1.234567890123e-05),每个字符占1字节(UTF-8下),单这一项就比原始8字节大了1-2倍;16位电压值转成字符串(比如32767)是5个字符,也比原始2字节大很多。
  • 额外文本开销:CSV每行需要分隔符(默认逗号)、换行符,再加上你代码里没禁用索引(.to_csv()默认会写入索引列),每行又多了一列索引的字符串(比如12345,1.23e-06,3.45里的12345),这些额外字符累加起来也是不小的体积。
  • 浮点数格式化损耗:np.linspace生成的float64时间值,CSV存储时会按pandas默认精度转换成字符串,默认会保留足够多的小数位来保证数值精度,这进一步放大了单条数据的存储长度。

pandas.to_csv()的工作机制

  • 类型转换阶段:遍历DataFrame的每一行和每一列,把所有单元格的数值(不管是整数、浮点数还是其他类型)统一转换成人类可读的字符串。对于数值类型,会遵循pandas默认的格式化规则(比如浮点数默认保留6位小数,大数值用科学计数法)生成对应字符串。
  • 文本拼接阶段:把每行的所有字符串用指定分隔符(默认逗号)拼接成一行文本,末尾加上换行符;同时会处理表头行,把列名也转换成字符串并拼接。
  • 文件写入阶段:把拼接好的文本内容(可以逐行或批量)写入目标文件,默认使用UTF-8编码存储每个字符;如果没设置index=False,还会额外把每行的索引值转换成字符串加入到行首。
  • 编码与缓存:内部会处理字符编码转换,同时可能使用缓存来提升写入效率,但核心还是基于文本的逐行生成与写入。

内容的提问来源于stack exchange,提问作者roman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:55:18