【问题标题】:NameError while converting tar.gz to zip将 tar.gz 转换为 zip 时出现 NameError
【发布时间】:2016-09-01 15:05:10
【问题描述】:

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

【问题讨论】:

    标签: python zip tar zipfile tarfile


    【解决方案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 )
    

    【讨论】:

    • 谢谢。当我这样做时,我收到了一个新错误:“TypeError: unbound method open() must be called with ZipFile instance as first argument (什么都没有)”
    • @Geet:更新;您使用的是对 ZipFile().open() 方法的引用,而不是创建 ZipFile 类的实例。
    • @Martjin Pieters:参数“compress_type”有什么问题吗?现在,我收到“TypeError: __init__() got an unexpected keyword argument 'compress_type'
    • @Geet:啊,确实没有这个关键字;您可以按位置传递参数,但正确的名称是compression
    • 知道了。我还将“r|gz”更改为“r:gz”以解决新错误“StreamError:不允许向后搜索”非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2020-03-16
    • 2020-06-15
    • 2016-09-08
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多