【问题标题】:How do I decompress a .gz file and save the decompressed file to a different directory in Python?如何解压 .gz 文件并将解压后的文件保存到 Python 中的不同目录?
【发布时间】:2020-06-21 02:04:52
【问题描述】:

我有一个 70GB 的 .gz 文件,我正在尝试解压缩并保存到其他目录,但到目前为止没有成功。

以下是我尝试过的一些事情:

import gzip

f = gzip.open('/directory1/file.txt.gz', 'rb')

decompressed_file = gzip.GzipFile(fileobj=f)

with open('/directory2/file.txt', 'wb') as s:
 s.write(decompressed_file.read())
 s.close

当我运行上述程序时,'/directory2/file.txt' 被创建,但文件为空,终端终止进程。

import subprocess

subprocess.run(['zcat', '/directory1/file.txt.gz', '>', '/directory2/file.txt'])

这个 zcat 命令在终端中执行时运行良好,但在 Python 中运行时,我正在解压缩的文件的全部内容都会打印到控制台。这显然会显着减慢解压缩速度。我正在运行这些命令的远程服务器有一个时间限制,它将在进程完成之前结束。

subprocess.run(['zcat', '/directory1/file.txt.gz', '>', '/directory2/file.txt'], stdout = subprocess.PIPE)

当我运行上面的,我得到这个错误:

File "/usr/lib64/python3.6/subprocess.py", line 425, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
File "/usr/lib64/python3.6/subprocess.py", line 850, in communicate
    stdout = self.stdout.read()
OSError: [Errno 14] Bad address

我做错了什么,或者完成我想做的事情的正确方法是什么?感觉解压 .gz 文件并将其保存到不同的目录应该是微不足道的,但到目前为止我还没有运气。

【问题讨论】:

  • "read" 可以采用大小参数。您需要一个循环来读取文件的合理部分,写入它,重复。当“读取”返回空字节对象时停止循环。

标签: python subprocess gzip


【解决方案1】:

您可以尝试几个更改:

  1. 在子进程中,使用 'gunzip' Unix 命令而不是 'zcat'
  2. 将“gunzip”命令放在 shell 脚本文件中,例如bash 外壳。 subprocess.call() 脚本文件而不是直接命令。如果您需要执行其他操作系统级别的操作(例如文件复制或移动到不同的位置等),这可能会有所帮助。请确保在命令行中使用“chmod”将 shell 脚本文件设置为可执行文件。

祝你好运。

【讨论】:

    【解决方案2】:

    似乎进程死了,因为您试图将整个存档加载到内存中。观察内存使用情况以确认这一点。

    因为GzipFile 构造了类似文件的对象,所以可以通过shutil.copyfileobj 运行它。让我们为此创建函数:

    import gzip
    import shutil
    BUFFER_SIZE = 200 * 1024 * 1024 # 200 mb, arbitrary
    def gunzip(source, destination, buffer_size=BUFFER_SIZE):
        with gzip.open(source) as s:
            with open(destination, 'wb') as d:
                shutil.copyfileobj(s, d, buffer_size)
    

    并使用它:

    gunzip("/directory1/file.txt.gz", "/directory2/file.txt")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 2015-09-10
      • 2016-08-11
      • 1970-01-01
      相关资源
      最近更新 更多