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


88

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

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


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


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()

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')

13
Обратите внимание, что shэто не входит в стандартную установку.
Noumenon
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.