0

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

1 回答 1

1

ZIP_DEFLATED是模块定义zipfile的名称;从那里引用它:

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

请注意,您不使用ZipFile.open()此处的方法;您不是在存档中打开成员,而是在写入对象

此外,正确的ZipFile类签名将第三个参数命名为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 )
于 2016-09-01T15:07:34.977 回答