Python zipfile模块添加空字节而不是正确内容的文件

时间:2015-09-19 17:27:05

标签: python zip

当我使用zipfile.ZipFile.writestr时,文件后面包含正确数量的字符,但所有字符都是空字节。

最小例子:

import zipfile
z=zipfile.ZipFile("test.zip", "w")
z.writestr("foo", "test")
z.close()

生成的test.zip里面有一个文件“foo”,其中包含4个空字节。

2 个答案:

答案 0 :(得分:1)

遇到同样的问题,看起来ZipInfo就是明显的解决方法。

import zipfile, os

name = 'foo.txt'
data = b'This is a test text.'

open(name, 'wb').write(data)
zipfile.ZipFile('write.zip', 'w').write(name)              # OK for Ark
zipfile.ZipFile('writestr.zip', 'w').writestr(name, data)  # nulls by Ark

wrt_attr = zipfile.ZipFile('write.zip').getinfo(name)
wrts_attr = zipfile.ZipFile('writestr.zip').getinfo(name)

os.remove(name)
os.remove('write.zip')
os.remove('writestr.zip')

for attr in wrt_attr.__slots__:
    if getattr(wrt_attr, attr) != getattr(wrts_attr, attr):
        attr, getattr(wrt_attr, attr), getattr(wrts_attr, attr)

attr = 'external_attr'
oct(getattr(wrt_attr, attr)>>16), oct(getattr(wrts_attr, attr)>>16)

ZIP spec表示,如果内容来自external_attr,则stdin应设置为零。但是,writestr在第一个参数为str时构造invalid external_attr。

可能是

0o100xxx (regular file with umasked permission)

zero (as the spec)

但不是

0oxxx (file type absent)

答案 1 :(得分:0)

似乎不是一个python问题,因为它只是#34; ark",它无法打开这个文件。 另一方面,它似乎以某种方式编码,ark无法读取它(而其他解压缩程序可以)。