将 tar.gz 转换为 zip 时出现 NameError

NameError while converting tar.gz to zip

我从关于如何将 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

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 )