为何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
相关产品推荐
相关产品推荐

