如何使用Python解压缩gz文件

178
我需要将从FTP站点下载的gz文件提取到本地Windows文件服务器。我已经设置了变量以用于文件的本地路径,并且知道它可以通过GZIP工具使用。
我该如何做? GZ文件内部的文件是XML文件。

7
请问能否让我们看看您已经尝试过的内容? - heinst
3
为什么这个问题会被踩得那么厉害?考虑到有两个答案的赞数都超过了一个单位,这个问题应该不会那么糟糕吧。 - Paulo Neves
4
可能是因为这个问题作者没有做任何研究。 - bfontaine
10个回答

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

4
为什么你加了一个“with”语句?这是常见的做法吗?你可以使用同一个上下文管理器打开多个文件。 - RomainL.
2
可能是因为你读取了 f_in 并写入了 f_out。根据文档,你需要为读取对象和写入对象提供参数,https://docs.python.org/3/library/shutil.html#shutil.copyfileobj。 - paxton91michael
10
这就是 'with' 语句的用途。它在 "with" 段落结束时执行 f_in.close()。如果出现问题(如异常),这非常有用。它确保资源被关闭。 - sweetdream
4
请注意 shutil.copyfileobj() 函数有一个第三个参数 length:*"如果提供了整数长度,则它是缓冲区大小。特别地,负值长度意味着直接复制数据而不需要分块循环源数据。默认情况下会分块读取数据以避免非受控制的内存消耗。"* - norok2
3
@余翔,gzip一次只能压缩一个文件,这就是为什么它经常与tar归档一起使用的原因。如果你有一个.tar.gz或.tgz文件,你应该查看tar模块,而不是gzip模块。 - mrBen
显示剩余3条评论

64

从文档中:

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

这个解决方案对我在Python 2.7上有效,而且没有导入任何库。@heinst非常感谢。 - Farzad Farazmand
4
请注意,这可能会使您的内存溢出,因为它将同时将所有内容解压到RAM中。如果您只想解压缩文件而不加载它,则Matt给出的答案是最佳选择。 - Michael
2
@Michael 这是当时直接从 Python 文档中摘取的,所以请告诉他们。 - heinst

26

也许您希望将它传递给Pandas。

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

    features_train = pd.read_csv(f)

features_train.head()

15
这与熊猫有什么关系? "GZ 文件中的文件是一个 XML 文件" -- OP - c z
4
这是一个非常有用的答案。用户可能会通过搜索引擎着陆在这个页面上,而实际上pandas很好地处理xml文件。 - Wtower

10
from sh import gunzip

gunzip('/tmp/file1.gz')

22
请注意,sh 不是标准安装的一部分。 - Noumenon
我相信这是一个直接的解决方案。 - itsvps

8

因为你正在使用xml数据,目前还没有pd.read_xml()函数(截至v0.23.4),所以我的回答并不完全准确。但是,从pandas v0.21.0开始,它可以帮助你解压文件!感谢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()

4
虽然这段代码可能回答了问题,但是提供关于它如何以及/或者为什么解决问题的额外上下文信息,将会提高回答的长期价值。 - Nic3500
1
很棒的答案。它以非常简单 (Python 风格) 的方式读取压缩的 json 数据。 - lordcenzin

7

如果您在解压缩后解析文件,请不要忘记使用decode()方法。当您将文件以二进制方式打开时,这是必需的。

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

4

非常简单..下面就是方法!!

import gzip

#path_to_file_to_be_extracted

ip = sample.gzip

#output file to be filled

op = open("output_file","w") 

with gzip.open(ip,"rb") as ip_byte:
    op.write(ip_byte.read().decode("utf-8")
    wf.close()

4
您可以使用gzip.decompress()来完成此操作:
  1. 使用rb模式读取输入文件;
  2. 使用w模式和utf8编码打开输出文件;
  3. gzip.decompress()输入字节;
  4. 将得到的结果解码为str
  5. str写入输出文件。
请注意,保留HTML标签,但不要写解释。
def decompress(infile, tofile):
    with open(infile, 'rb') as inf, open(tofile, 'w', encoding='utf8') as tof:
        decom_str = gzip.decompress(inf.read()).decode('utf-8')
        tof.write(decom_str)

1
如果您的计算机上安装了gzip(和gunzip)程序,则可以通过从Python调用该命令来简单地实现:
import os
filename = 'file.txt.gz'
os.system('gunzip ' + filename)

如果您想保留原始文件,可以选择使用

os.system('gunzip --keep ' + filename)

在旧系统上,您可能需要使用gunzip -c file.txt.gz > file.txt命令,因此命令将是: os.system('gunzip -c '+ filename + ' > '+ filename [:-3]) - mgb
os.system("gunzip path/to/filename") 出现错误 | sh: gunzip: command not found 但是从命令行中我可以使用gunzip,有什么线索为什么会发生这种情况? - JustTry
你的Python发行版可能使用不同于命令行的shell(或路径设置)。找到gunzip应用程序的完整路径(在-nix系统上为“which gunzip”),然后像这样输入:os.system('/opt/local/bin/gunzip ' + filename) - mgb

-5

如果您有Linux环境,使用命令gunzip解压非常容易。 进入文件夹并执行以下操作:

gunzip file-name 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接