使用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
相关产品推荐
相关产品推荐

