You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 00:45:04