Как извлечь файл gz в python - PullRequest
       6

Как извлечь файл gz в python

0 голосов
/ 14 сентября 2018

У меня есть файл .gz, внутри которого есть другой файл.Мне нужно извлечь файл внутри архива.

f = gzip.open(dest, 'rb')

Это только открывает файл, но мне нужно скачать этот конкретный файл, который находится внутри gz, а не просто открывать файл gz.

Этот вопрос был помечен какдубликат, который я принимаю, но я не нашел решения, где мы могли бы действительно загрузить файл, а не просто прочитать его содержимое.То же самое и с упомянутой ссылкой.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я решил проблему следующим образом:

f = gzip.open(dest, 'r')
file_content = f.read()
file_content = file_content.decode('utf-8')
f_out = open('file', 'w+')
f_out.write(file_content)
f.close()
f_out.close()

dest - это файл с gz

0 голосов
/ 14 сентября 2018

Вы можете просто открыть два файла, прочитать из файла gzipped и записать в другой файл (в блоках, чтобы избежать засорения памяти).

import gzip

def gunzip(source_filepath, dest_filepath, block_size=65536):
    with gzip.open(source_filepath, 'rb') as s_file, \
            open(dest_filepath, 'wb') as d_file:
        while True:
            block = s_file.read(block_size)
            if not block:
                break
            else:
                d_file.write(block)
        d_file.write(block)

В противном случае вы можете использовать shutil, как предложено в Как распаковать файл gz с помощью Python :

import gzip
import shutil

def gunzip_shutil(source_filepath, dest_filepath, block_size=65536):
    with gzip.open(source_filepath, 'rb') as s_file, \
            open(dest_filepath, 'wb') as d_file:
        shutil.copyfileobj(s_file, d_file, block_size)

Оба решения будут работать в Python 2 и 3.

По производительности они практически эквивалентны, по крайней мере, для моей системы:

%timeit gunzip(source_filepath, dest_filepath)
# 129 ms ± 1.89 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit gunzip_shutil(source_filepath, dest_filepath)
# 132 ms ± 2.99 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...