Как разархивировать файл gz с помощью Python

88

Мне нужно извлечь файл gz, который я загрузил с FTP-сайта, на локальный файловый сервер Windows. У меня есть переменные, заданные для локального пути к файлу, и я знаю, что это может использоваться путаницей GZIP.

Как я могу это сделать? Файл внутри файла GZ - это файл XML.

Darkdeamon
источник
5
Можем ли мы посмотреть, что вы пробовали?
Heinst
1
Почему это так отвергнуто? Вопрос не может быть таким уж плохим, учитывая, что есть 2 ответа с указанными выше едиными голосами.
Пауло Невес
@PauloNeves, вероятно, потому, что в вопросе вообще нет исследования его автора.
bfontaine

Ответы:

145
import gzip
import shutil
with gzip.open('file.txt.gz', 'rb') as f_in:
    with open('file.txt', 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)
Мэтт
источник
3
зачем ты ставил второй с? это обычная практика? вы можете открыть несколько файлов с помощью одного контекстного менеджера
RomainL.
1
Вероятно, потому что вы читаете f_in и пишете f_out. Согласно документам, вам нужны параметры для чтения obj и записи obj, docs.python.org/3/library/shutil.html#shutil.copyfileobj .
paxton91michael
@ Мэтт Разве ты не должен закрыть f_in и f_out?
JeyJ 02
7
@JeyJ: это цель оператора 'with'. Он выполняет f_in.close () при наличии раздела "with". Действительно полезно, если что-то идет не так (например, исключение). Он следит за тем, чтобы ресурс был закрыт
sweetdream
1
Обратите внимание, что у shutil.copyfileobj()него есть третий параметр length: «Целочисленная длина, если задана, представляет собой размер буфера. В частности, отрицательное значение длины означает копирование данных без циклического перебора исходных данных по частям; по умолчанию данные считываются фрагментами для избегать неконтролируемого потребления памяти ".
norok2
31

Из документации:

import gzip
f = gzip.open('file.txt.gz', 'rb')
file_content = f.read()
f.close()
Heinst
источник
это решение работает для меня на python 2.7 без импорта какой-либо библиотеки, @heinst большое спасибо
Фарзад Фаразманд
9

Может быть, вы хотите передать его также пандам.

with gzip.open('features_train.csv.gz') as f:

    features_train = pd.read_csv(f)

features_train.head()
Фэйян Чен
источник
2
При чем тут Панды? « Файл внутри файла GZ представляет собой файл XML » - OP
cz
4

Не точный ответ, потому что вы используете xml-данные и в настоящее время нет pd.read_xml()функции (начиная с v0.23.4), но pandas (начиная с v0.21.0) может распаковать файл за вас! Спасибо, Вес!

import pandas as pd
import os
fn = '../data/file_to_load.json.gz'
print(os.path.isfile(fn))
df = pd.read_json(fn, lines=True, compression='gzip')
df.tail()
whs2k
источник
3
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Nic3500 07
1
отличный ответ. Он просто читает сжатый json очень простым (питоническим) способом.
lordcenzin 03
4

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

import gzip
with gzip.open(file.gz, 'rb') as f:
    for line in f:
        print(line.decode().strip())
Педро Х. Сола
источник
2
from sh import gunzip

gunzip('/tmp/file1.gz')
perfecto25
источник
13
Обратите внимание, что shэто не входит в стандартную установку.
Noumenon