当我使用zipfile.ZipFile.writestr
时,文件后面包含正确数量的字符,但所有字符都是空字节。
最小例子:
import zipfile
z=zipfile.ZipFile("test.zip", "w")
z.writestr("foo", "test")
z.close()
生成的test.zip里面有一个文件“foo”,其中包含4个空字节。
答案 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无法读取它(而其他解压缩程序可以)。