CSV转Parquet再转回CSV后文件大小不一致,请问原因?
问题:CSV转Parquet再转回CSV后文件大小不一致
我尝试将大型CSV文件保存为Parquet格式,再转换回CSV格式。运行以下代码后,最终生成的CSV文件大小与原文件不一致,但数据的行数列数完全相同。
运行代码
import pandas as pd import os # 注:原代码遗漏os模块导入,此处补充 # 读取CSV文件 csvFile = 'test.csv' df = pd.read_csv(csvFile) # 显示文件及数据信息 csvFileSize = ((os.path.getsize(csvFile)/1024)/1024)/1024 print("CSV File Size (GB) : ", csvFileSize) print("Data Details : ", df.shape) # 保存为Parquet格式 parquetFile = csvFile.replace('csv', 'parquet') df.to_parquet(parquetFile, index=None) parquetFileSize = ((os.path.getsize(csvFile.replace('csv','parquet'))/1024)/1024)/1024 print("Parquet File Size (GB) : ", parquetFileSize) print("Storage Size Saved : ", round(100 - (parquetFileSize/csvFileSize)*100,2), "%") # 读取Parquet并转回CSV df = pd.read_parquet(parquetFile) csvFile = 'Reconverted_' + csvFile df.to_csv(csvFile, index=False) csvFileSize = ((os.path.getsize(csvFile)/1024)/1024)/1024 print("Reconverted CSV (GB) : ", csvFileSize) print("Data Details : ", df.shape)
输出结果
CSV File Size (GB) : 6.168231673538685 Data Details : (3679839, 55) Parquet File Size (GB) : 1.0481115290895104 Storage Size Saved : 83.01 % Reconverted CSV (GB) : 6.157632351852953 Data Details : (3679839, 55)
原因分析及解决办法
文件大小不一致但数据结构(行、列数)完全匹配,说明核心数据没有丢失,差异来自CSV格式的细节处理,常见原因包括:
- 引号与空格处理差异:原CSV可能对部分字段用引号包裹、存在首尾空格,pandas读取时会自动解析或清理这些格式细节,转回CSV时默认的引号规则(如
quoting参数)、空格保留逻辑和原文件不一致,导致字节数变化。 - 数据类型序列化差异:比如原CSV中的日期、数值类型,pandas读取后转为内部数据类型,转回CSV时的字符串格式(如日期分隔符、数值精度)可能和原文件不同,字符长度变化影响文件大小。
- 空值表示不同:原CSV的空值可能用
NA、NULL或特定字符串表示,pandas统一转为NaN后,转回CSV默认输出空字符串,和原空值的字节长度不同。 - 编码差异:原CSV若使用非UTF-8编码(如GBK),pandas
to_csv默认用UTF-8保存,不同编码下相同字符的字节数不同(如中文在UTF-8占3字节,GBK占2字节)。
如果需要生成和原文件完全一致的CSV,需调整读写参数匹配原文件的格式:
- 读取CSV时,指定
na_values匹配原文件的空值标识,添加keep_default_na=False避免默认空值解析; - 写入CSV时,用
quoting参数(如csv.QUOTE_ALL/csv.QUOTE_NONNUMERIC)匹配原文件的引号规则,指定date_format统一日期输出格式; - 读写时指定和原文件一致的
encoding参数。
内容的提问来源于stack exchange,提问作者Joel Divekar
相关产品推荐
相关产品推荐

