将tar.gz转换为zip时的NameError

时间:2016-09-01 15:05:11

标签: python zip tar zipfile tarfile

我从如何将tar.gz文件转换为zip文件的问题中获得了以下代码。

import tarfile, zipfile
tarf = tarfile.open(name='sample.tar.gz', mode='r|gz' )
zipf = zipfile.ZipFile.open( name='myzip.zip', mode='a', compress_type=ZIP_DEFLATED )
for m in tarf.getmembers():
    f = tarf.extractfile( m )
    fl = f.read()
    fn = m.name
    zipf.writestr( fn, fl )
tarf.close()
zipf.close()

但是当我运行它时我得到了错误。

我应该在代码中更改哪些内容才能使其正常工作?

NameError: name 'ZIP_DEFLATED' is not defined

1 个答案:

答案 0 :(得分:1)

ZIP_DEFLATED是一个名称defined by the zipfile module;从那里引用它:

zipf = zipfile.ZipFile(
    'myzip.zip', mode='a',
    compression=zipfile.ZIP_DEFLATED)

请注意,此处不使用ZipFile.open()方法;你没有在档案中打开成员,你正在写对象。

此外,正确的ZipFile class signature命名第三个参数compressioncompress_type仅用作ZipInfo个对象和ZipFile.writestr()方法的属性。第一个参数也没有命名为name;它是file,但您通常只会将值作为位置参数传递。

接下来,您无法在gzip压缩的tar文件中进行搜索,因此如果您使用tarf.getmembers(),则在按顺序访问成员时会遇到问题。此方法必须执行完整扫描才能找到构建列表的所有成员,然后您无法再返回读取文件数据。

相反,直接在对象上进行迭代,并且您仍然可以按顺序获取成员对象,您仍然可以读取文件数据:

for m in tarf:
    f = tarf.extractfile( m )
    fl = f.read()
    fn = m.name
    zipf.writestr( fn, fl )