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

使用Python将多个.gz文件解压合并为单个txt文件仅保留最后一个文件数据问题求解

问题根因

你现有代码的问题有两个:

  • 循环内每次都以wb(二进制覆盖写入)模式打开输出文件,每次循环都会清空文件原有内容,只有最后一次循环写入的内容会被保留
  • 代码中使用了shutil.copyfileobj但没有导入shutil库,运行会直接报错
修复方案

两种可行实现方式:

方式1:循环外打开输出文件(性能更优,只打开一次文件)

from glob import glob
import gzip
import shutil

# 提前以二进制写入模式打开输出文件
with open('.../datafiles/202004_twitter/decompressed.txt', 'wb') as f_out:
    for fname in glob('.../2020-04/*gz'):
        with gzip.open(fname, 'rb') as f_in:
            shutil.copyfileobj(f_in, f_out)

方式2:循环内用追加模式打开(适合需要按条件跳过部分文件、灵活控制写入时机的场景)

把打开输出文件的模式从wb改成ab(二进制追加写入)即可,注意首次运行前要确认目标文件不存在/为空,避免重复追加内容:

from glob import glob
import gzip
import shutil

for fname in glob('.../2020-04/*gz'):
    with gzip.open(fname, 'rb') as f_in:
        # 改用ab追加模式
        with open('.../datafiles/202004_twitter/decompressed.txt', 'ab') as f_out:
            shutil.copyfileobj(f_in, f_out)
额外注意事项
  • 如果每个gz解压后的JSON是单行的,合并后的文件每行就是一个JSON,可直接按行读取解析;如果单个gz内有多行JSON,合并后格式也不会错乱,符合你的使用需求
  • 如果要保证文件处理顺序,可以给glob返回的文件名列表加sort()排序,避免不同操作系统返回的文件顺序不一致:
f_list = glob('.../2020-04/*gz')
f_list.sort()
for fname in f_list:
    # 后续处理逻辑

内容的提问来源于stack exchange,提问作者Trishala Suryavanshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:24:03