Як розпакувати файл 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

@Matt Чи не слід також закривати f_in та f_out?
JeyJ,

7
@JeyJ: це мета заяви "with". Він виконує f_in.close () на час існування розділу "with". Дійсно корисно, якщо щось йде не так (як виняток). Це гарантує, що ресурс закрито
sweetdream

1
Зауважте, що shutil.copyfileobj()є третій параметр length: "Цілочисельна довжина, якщо вказана, є розміром буфера. Зокрема, від’ємне значення довжини означає копіювати дані, не перебираючи вихідні дані в шматках; за замовчуванням дані зчитуються в шматках до уникайте неконтрольованого споживання пам'яті ".
norok2


10

Можливо, ви також хочете передати його пандам.

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), але панди (починаючи з 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

1
чудова відповідь. Він просто читає стислий json дуже простим (пітонічним) способом.
lordcenzin

4

Якщо ви розбираєте файл після його розпакування, не забудьте використати метод decode () , необхідний при відкритті файлу як двійковий.

import gzip
with gzip.open(file.gz, 'rb') as f:
    for line in f:
        print(line.decode().strip())

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.