如何使用Python解压缩gz文件


83

我需要提取从FTP站点下载到本地Windows文件服务器的gz文件。我已经为文件的本地路径设置了变量,并且我知道GZIP混乱可以使用它。

我怎样才能做到这一点?GZ文件中的文件是XML文件。


5
我们可以看看您尝试了什么吗?
heinst 2015年

1
为什么这么低估?鉴于上述单一投票有2个答案,这个问题可以不是那么糟糕。
Paulo Neves

@PauloNeves可能是因为该问题并未显示其作者的任何研究。
bfontaine

Answers:


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
你为什么要花一秒钟?这是惯例吗?您可以使用相同的上下文管理器
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”语句的目的。它在“ with”部分存在时执行f_in.close()。如果出现问题(例如异常),这真的很有用。它确保资源已关闭
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 '18

1
好答案。它只是以非常简单(Pythonic)的方式读取压缩的json。
lordcenzin

3

如果要在解压缩文件之后解析文件,请不要忘记使用当以二进制文件打开文件时必须使用的encode()方法。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.