如何转置大型文件并获取体积更小的数据文件
你的输出文件体积异常偏大的核心原因是to_string()方法为了控制台打印对齐,会自动填充大量无意义的空白字符,这类格式化输出的冗余占比通常能达到70%以上,加上你选择了无压缩的纯文本txt格式,才会生成1.5G的超大文件。可以按以下优先级优化:
优先弃用格式化txt输出,改用压缩存储格式
转置后的数据为20行、40万列的结构,完全不需要做对齐格式化。如果后续需要通过代码处理数据,直接输出带压缩的存储格式即可,压缩后体积通常只有原txt的1/10~1/20,普通笔记本可以轻松读写:import pandas as pd # 读取csv时指定index_col=0,去掉之前转存csv时生成的多余无名列 df = pd.read_csv("file.csv", index_col=0) transposed_df = df.T # 输出gzip压缩的csv,兼顾通用性和压缩率 transposed_df.to_csv("transposed_file.csv.gz", compression="gzip") # 如果不需要纯文本兼容性,输出parquet格式体积更小、读写速度更快 # transposed_df.to_parquet("transposed_file.parquet", compression="brotli")这种方式生成的文件通常在30MB~100MB区间,不会出现打不开的问题。
若必须输出纯文本txt格式,移除格式化冗余
不要使用to_string()方法,直接用to_csv指定分隔符输出txt即可,不会生成多余的对齐空格,体积比原输出小80%以上:# 用制表符做分隔符,无额外空白填充 transposed_df.to_csv("transposed_file.txt", sep="\t", index=True)跳过中间转csv步骤,降低全流程内存占用
你最开始用pandas直接处理Excel失败,大概率是默认读取引擎内存占用过高,可以换成内存效率更高的calamine引擎直接读取Excel,省掉中间转csv的步骤,减少磁盘占用和内存消耗:# 先安装依赖:pip install python-calamine import pandas as pd df = pd.read_excel("file.xlsx", engine="calamine") transposed_df = df.T transposed_df.to_csv("transposed_file.csv.gz", compression="gzip")低内存设备可选流式分块处理
如果设备内存实在不足以加载全量数据,可以用逐列读取原始文件、逐行写入转置文件的流式处理逻辑,全程内存占用可以控制在100MB以内,不需要把全量数据加载到内存中。
注意:转置后的文件有40万列,哪怕体积压缩到很小,普通文本编辑器、Excel这类工具也不支持打开这么宽的表格,后续处理直接用pandas读取压缩文件即可,不需要手动打开查看全量内容。
内容的提问来源于stack exchange,提问作者Firefoxer

