使用Python生成的CSV文件体积过大,附代码寻求优化方案
问题:Python生成的CSV文件体积过大
我用Python创建了一个CSV文件,但生成的文件体积超出预期,以下是我用来创建CSV的代码片段:
import csv srcFile = open("C:\Users\XXXX\Expenses.csv","r") data = srcFile.read() srcList = data.split("\n") colNames = srcList[0].split(",") header = srcList[1] sheetData = srcList[2:] final_data = [] expense_data = [] for row in sheetData: split_row = row.split(",") final_data.append(split_row) for row in range(0, len(final_data)-1): for col in range(3, 30): loc = final_data[row][0] opsheet = final_data[row][1] rowNum = final_data[row][2] colNam...
恳请各位提供优化文件体积的解决方案。
优化CSV文件体积的实用方案
1. 别再手动分割CSV,用内置csv模块高效读写
你现在靠split("\n")和split(",")手动拆分CSV的方式,不仅容易踩坑(比如字段里带逗号、换行符的情况会直接拆坏数据),还会因为额外的字符串操作占用更多内存,间接让生成的文件带冗余。换成Python自带的csv.reader和csv.writer处理,它会自动处理特殊字符,生成更紧凑的标准CSV:
import csv # 读取源文件,用with自动管理文件句柄更安全 with open(r"C:\Users\XXXX\Expenses.csv", "r", newline="", encoding="utf-8") as src_file: reader = csv.reader(src_file) col_names = next(reader) header = next(reader) sheet_data = list(reader) # 处理完数据后写入优化后的CSV with open(r"C:\Users\XXXX\Optimized_Expenses.csv", "w", newline="", encoding="utf-8") as out_file: writer = csv.writer(out_file) writer.writerow(col_names) writer.writerow(header) writer.writerows(sheet_data)
2. 直接生成压缩文件
如果你的数据量本身就很大,压缩是最立竿见影的办法。用Python的gzip或zipfile模块直接把CSV打包成压缩格式,体积能砍半甚至更多:
比如用gzip生成压缩文件:
import csv import gzip with open(r"C:\Users\XXXX\Expenses.csv", "r", newline="", encoding="utf-8") as src_file: reader = csv.reader(src_file) # 写入gzip压缩文件,wt表示文本模式写入 with gzip.open(r"C:\Users\XXXX\Expenses.csv.gz", "wt", encoding="utf-8") as gz_file: writer = csv.writer(gz_file) writer.writerows(reader)
3. 清理冗余数据
先检查你的数据处理逻辑:有没有重复的行?有没有全是空值的列?或者某些字段能不能精简?比如如果第3到30列里大量都是空值,完全可以只保留有实际数据的列,去掉这些无效内容能大幅缩小文件体积。
4. 换成更紧凑的二进制格式(替代CSV)
如果业务场景允许,别死磕CSV了,试试Parquet、Feather这类二进制格式,它们是专门为大数据存储优化的,体积比CSV小得多,读写速度也更快。用Pandas就能轻松实现:
(需要先安装依赖:pip install pandas pyarrow)
import pandas as pd # 读取原CSV df = pd.read_csv(r"C:\Users\XXXX\Expenses.csv") # 保存为Parquet格式 df.to_parquet(r"C:\Users\XXXX\Expenses.parquet")
5. 优化编码和换行符
确保写入时用合适的编码(比如utf-8比一些老旧编码更紧凑),并且指定newline="",避免csv.writer生成多余的换行符,减少文件里的无效字节。
内容的提问来源于stack exchange,提问作者Sri Rama
相关产品推荐
相关产品推荐

