在Python中使用GZIP模块

时间:2013-12-17 13:18:23

标签: python gzip

我正在尝试使用Python GZIP模块简单地解压缩目录中的几个.gz文件。请注意,我不想读取文件,只能解压缩它们。在搜索了这个网站一段时间之后,我有了这个代码段,但它不起作用:

import gzip
import glob
import os
for file in glob.glob(PATH_TO_FILE + "/*.gz"):
    #print file
    if os.path.isdir(file) == False:
        shutil.copy(file, FILE_DIR)
        # uncompress the file
        inF = gzip.open(file, 'rb')
        s = inF.read()
        inF.close()

.gz文件位于正确的位置,我可以使用print命令打印完整路径+文件名,但GZIP模块没有正确执行。我错过了什么?

5 个答案:

答案 0 :(得分:40)

如果没有错误,gzip模块可能 正确执行。

  

我不想读取文件,只解压缩它们

gzip模块不能用作7-zip等桌面存档程序 - 如果不“读取”文件,就无法“解压缩”文件。从编程的角度来看,“解压缩”可能意味着更准确地描述为“从压缩文件中读取流,并将其写入新文件”。

inF = gzip.open(file, 'rb')
s = inF.read()
inF.close()

在这里,您只是阅读流。您只需将其写入新文件:

inF = gzip.open(file, 'rb')
outF = open(outfilename, 'wb')
outF.write( inF.read() )
inF.close()
outF.close()

答案 1 :(得分:6)

您应该使用with打开文件,当然还要存储读取压缩文件的结果。见gzip documentation

import gzip
import glob
import os
import os.path

for gzip_path in glob.glob("%s/*.gz" % PATH_TO_FILE):
    if not os.path.isdir(gzip_path):
        with gzip.open(gzip_path, 'rb') as in_file:
            s = in_file.read()

        # Now store the uncompressed data
        path_to_store = gzip_fname[:-3]  # remove the '.gz' from the filename

        # store uncompressed file data from 's' variable
        with open(path_to_store, 'w') as f:
            f.write(s)

根据您想要做什么,您可能需要查看tarfile及其'r:gz'选项以打开文件。

答案 2 :(得分:5)

您正在将文件解压缩到s变量中,并且不执行任何操作。你应该停止搜索stackoverflow并阅读至少python教程。严重。

无论如何,你的代码有几个问题:

  1. 您需要将s中的解压缩数据存储到某个文件中。

  2. 无需复制实际的*.gz文件。因为在您的代码中,您正在解压缩原始gzip文件而不是副本。

  3. 您使用file这是一个保留字,作为变量。这不是 一个错误,只是一个非常糟糕的做法。

  4. 这可能应该做你想要的:

    import gzip
    import glob
    import os
    import os.path
    
    for gzip_path in glob.glob(PATH_TO_FILE + "/*.gz"):
        if os.path.isdir(gzip_path) == False:
            inF = gzip.open(gzip_path, 'rb')
            # uncompress the gzip_path INTO THE 's' variable
            s = inF.read()
            inF.close()
    
            # get gzip filename (without directories)
            gzip_fname = os.path.basename(gzip_path)
            # get original filename (remove 3 characters from the end: ".gz")
            fname = gzip_fname[:-3]
            uncompressed_path = os.path.join(FILE_DIR, fname)
    
            # store uncompressed file data from 's' variable
            open(uncompressed_path, 'w').write(s)
    

答案 3 :(得分:4)

我能够通过使用子进程模块解决此问题:

for file in glob.glob(PATH_TO_FILE + "/*.gz"):
    if os.path.isdir(file) == False:
        shutil.copy(file, FILE_DIR)
        # uncompress the file
        subprocess.call(["gunzip", FILE_DIR + "/" + os.path.basename(file)])

由于我的目标是简单地解压缩存档,上面的代码就完成了。归档文件位于中心位置,并复制到工作区域,未压缩,并在测试用例中使用。 GZIP模块太复杂了,无法实现我的目标。

感谢大家的帮助。非常感谢!

答案 4 :(得分:0)

我认为有一个比其他人提出的更简单的解决方案,因为op只想提取目录中的所有文件:

import glob
from setuptools import archive_util

for fn in glob.glob('*.gz'):
  archive_util.unpack_archive(fn, '.')