我从如何将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
答案 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命名第三个参数compression
。 compress_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 )