Python对CSV文件执行Gzip压缩后内容截断该如何排查?
问题根因
你代码里负责写入CSV的文件对象没有显式关闭、也没有用上下文管理器自动管理生命周期,大文件写入时操作系统会把一部分内容滞留在内存缓冲区里,还没完全刷入磁盘就直接执行了gzip压缩命令,导致gzip拿到的是不完整的文件,自然就会缺失末尾行。你手动压缩时脚本已经执行完毕,Python解释器退出时会自动释放所有打开的文件句柄、刷入所有缓冲区内容,所以手动操作不会有问题。
修复方案
- 方案1:给写入CSV的逻辑加上上下文管理器,确保写入完成后文件自动关闭、缓冲区内容全部刷入磁盘后再执行压缩操作,修改后代码如下:
import csv import os #Remove quotes from file with open(localFile, "r") as csvfile: csvreader = csv.reader(csvfile, skipinitialspace=True) #Skip the header row next(csvreader) # 写入逻辑也用with语句包裹 with open(outputFile, "w") as outfile: writer = csv.writer(outfile, quoting=csv.QUOTE_NONE) for row in csvreader: writer.writerow(row) #Zip file zipCommand = f"gzip {outputFile}" exit_code = os.system(zipCommand)
- 方案2:如果不想调整原有结构,也可以在写入完成后手动调用
writer对应的文件对象的close()方法,再执行压缩命令。 - 额外优化建议:你可以直接把内容写入gzip文件,不需要先生成中间CSV文件再压缩,减少磁盘IO开销,示例代码如下:
import csv import gzip with open(localFile, "r") as csvfile, gzip.open(f"{outputFile}.gz", "wt") as gz_out: csvreader = csv.reader(csvfile, skipinitialspace=True) next(csvreader) writer = csv.writer(gz_out, quoting=csv.QUOTE_NONE) for row in csvreader: writer.writerow(row)
内容的提问来源于stack exchange,提问作者winepretzel
相关产品推荐
相关产品推荐

