Как распаковать файл .gz и сохранить распакованный файл в другом каталоге в Python? - PullRequest
1 голос
/ 21 июня 2020

У меня есть файл .gz размером 70 ГБ, который я пытаюсь распаковать и сохранить в другом каталоге, но пока безуспешно.

Вот некоторые вещи, которые я пробовал:

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

Что я делаю неправильно, или как правильно sh выполнить то, что я пытаюсь сделать? Такое ощущение, что распаковать файл .gz и сохранить его в другом каталоге должно быть тривиально, но пока мне не повезло.

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Вы можете попробовать несколько изменений:

  1. в подпроцессе, используйте команду 'gunzip' Unix вместо 'zcat'
  2. поместите команду 'gunzip' в файл сценария оболочки, например bash shell. subprocess.call () файл сценария, а не команду напрямую. Это может быть полезно, если вам нужно выполнить дополнительные манипуляции на уровне операционной системы, такие как копирование файлов или перемещение в другое место et c. Обязательно установите файл сценария оболочки как исполняемый с помощью 'chmod' в командной строке.

Удачи.

1 голос
/ 21 июня 2020

Похоже, что процесс умирает, потому что вы пытаетесь загрузить весь архив в память. Посмотрите, как используется память, чтобы убедиться в этом.

Поскольку 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")
...