如何解压.gz 文件并将解压后的文件保存到Python 中的不同目录?

How do I decompress a .gz file and save the decompressed file to a different directory in Python?

我有一个 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文件并保存到不同的目录应该是微不足道的,但到目前为止我还没有运气。

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

因为GzipFile constructs file-like object, it might be possible to run it through 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")

您可以尝试一些更改:

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

祝你好运。