Cách giải nén tệp gz bằng Python


83

Tôi cần giải nén tệp gz mà tôi đã tải xuống từ trang FTP vào máy chủ tệp Windows cục bộ. Tôi đã đặt các biến cho đường dẫn cục bộ của tệp và tôi biết nó có thể được sử dụng bởi GZIP muddle.

Tôi có thể làm cái này như thế nào? Tệp bên trong tệp GZ là tệp XML.


5
Chúng tôi có thể xem những gì bạn đã thử xin vui lòng?
phục hồi

1
Tại sao điều này lại bị phản đối? Câu hỏi không thể tệ đến mức có 2 câu trả lời với số phiếu ủng hộ đơn nhất ở trên.
Paulo Neves

@PauloNeves có lẽ vì câu hỏi không cho thấy bất kỳ nghiên cứu nào từ tác giả của nó.
bfontaine

Câu trả lời:


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

2
tại sao bạn đặt một giây với? đó là thông lệ? bạn có thể mở một số tệp với cùng một trình quản lý ngữ cảnh
RomainL.

1
Có thể là do bạn đọc f_in và viết f_out. Theo tài liệu, bạn cần tham số để đọc obj và viết obj, docs.python.org/3/library/shutil.html#shutil.copyfileobj .
paxton91michael

@Matt Bạn không nên đóng f_in và f_out?
JeyJ

7
@JeyJ: đây là mục đích của câu lệnh 'with'. Nó thực thi f_in.close () khi tồn tại phần "with". Thực sự hữu ích nếu có điều gì đó không ổn (như ngoại lệ). Nó đảm bảo rằng tài nguyên đã được đóng
sweetdream

1
Lưu ý rằng shutil.copyfileobj()có tham số thứ ba length: "Độ dài số nguyên, nếu được cho, là kích thước bộ đệm. Cụ thể, giá trị độ dài âm có nghĩa là sao chép dữ liệu mà không lặp lại dữ liệu nguồn theo từng phần; theo mặc định, dữ liệu được đọc theo từng phần tránh tiêu thụ bộ nhớ không kiểm soát. "
norok2

30

Từ tài liệu:

import gzip
f = gzip.open('file.txt.gz', 'rb')
file_content = f.read()
f.close()

giải pháp này làm việc cho tôi trên python 2.7 mà không cần nhập bất kỳ thư viện, @heinst thanks a lot
Farzad Farazmand

9

Có lẽ bạn cũng muốn chuyển nó cho gấu trúc.

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

    features_train = pd.read_csv(f)

features_train.head()

2
Điều này có liên quan gì đến gấu trúc? " Tệp bên trong tệp GZ là tệp XML " - OP
cz

4

Không phải là câu trả lời chính xác vì bạn đang sử dụng dữ liệu xml và hiện không có pd.read_xml()chức năng nào (kể từ v0.23.4), nhưng gấu trúc (bắt đầu bằng v0.21.0) có thể giải nén tệp cho bạn! Cảm ơn Wes!

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
Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do tại sao nó giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Nic3500,

1
câu trả lời chính xác. Nó chỉ đơn giản là đọc một json được nén theo một cách rất đơn giản (pythonic).
Lordcenzin

3

Nếu bạn đang phân tích cú pháp tệp sau khi giải nén, đừng quên sử dụng phương thức decode () , cần thiết khi bạn mở tệp dưới dạng nhị phân.

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
Lưu ý rằng đó shkhông phải là một phần của cài đặt tiêu chuẩn.
Noumenon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.