【问题标题】:Unzipping multiple .gz files into single text file using Python使用 Python 将多个 .gz 文件解压缩为单个文本文件
【发布时间】:2021-10-04 17:47:05
【问题描述】:

我正在尝试将多个 .gz 扩展文件解压缩到单个 .txt 文件中。所有这些文件都有json数据。

我尝试了以下代码:

from glob import glob
import gzip

for fname in glob('.../2020-04/*gz'):
    with gzip.open(fname, 'rb') as f_in:
     with open('.../datafiles/202004_twitter/decompressed.txt', 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)

但是解压后的.txt文件只有最后一个.gz文件的数据。

【问题讨论】:

  • wb 模式打开会先擦除文件
  • 在循环gz 文件列表之前打开txt 文件。然后将数据追加到已经打开的txt
  • 那我应该使用哪种模式?
  • 停止一遍又一遍地重新打开文件。仅在循环外部打开一次。 wb 如果你不把 open 放在循环里面就可以了。
  • 也就是说,把with open(...) as f_out:放在外面,把for fname in ...:放在里面。

标签: python gzip


【解决方案1】:

只需将f_out 随机播放到外部,以便您在遍历输入文件之前打开它并保持那个句柄打开。

from glob import glob
import gzip

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】:

    改用"wba" 模式。 a 以附加模式打开。单独w 将在打开文件时擦除文件。

    【讨论】:

    • 请不要。这意味着多次运行将相互附加(运行脚本两次并且您的decompressed.txt 有每个输入文档的两个副本),并且将open() 操作保持在循环的内部位置也远低于打开文件只有一次,因为它一遍又一遍地关闭和刷新对文件系统的写入。
    • 这并不总是不受欢迎的行为,也没有指定任何一种方式。效率也不是考虑因素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多