我正在尝试使用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模块没有正确执行。我错过了什么?
答案 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教程。严重。
无论如何,你的代码有几个问题:
您需要将s
中的解压缩数据存储到某个文件中。
无需复制实际的*.gz
文件。因为在您的代码中,您正在解压缩原始gzip文件而不是副本。
您使用file
这是一个保留字,作为变量。这不是
一个错误,只是一个非常糟糕的做法。
这可能应该做你想要的:
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, '.')