当我使用zipfile.ZipFile.writestr
时,文件后面包含正确数量的字符,但它们都是空字节。Python zipfile模块添加空字节而不是正确内容的文件
最少例如:
import zipfile
z=zipfile.ZipFile("test.zip", "w")
z.writestr("foo", "test")
z.close()
所得test.zip具有文件 “foo” 的内部,它包含4个空字节。
当我使用zipfile.ZipFile.writestr
时,文件后面包含正确数量的字符,但它们都是空字节。Python zipfile模块添加空字节而不是正确内容的文件
最少例如:
import zipfile
z=zipfile.ZipFile("test.zip", "w")
z.writestr("foo", "test")
z.close()
所得test.zip具有文件 “foo” 的内部,它包含4个空字节。
得到了同样的问题,似乎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说,如果内容是从stdin
来到external_attr
应设置为零。但是,当第一个参数是str时,writestr
会构造一个invalid external_attr。
这可能是
0o100xxx (regular file with umasked permission)
或
zero (as the spec)
但不
0oxxx (file type absent)
那么这是一个python(zipfile模块)错误?为什么来自writestr的输入需要另一个处理而不是普通文件?它有一些属性,可以追加数据,当它包含为“文件”时不起作用,或者有什么推理?只是好奇而已。而在1096行''zinfo.external_attr = 0o600 << 16''看起来像有人有一个想法,他在做什么,但遗憾的是他没有记录为什么这样。 – allo
这对我的作品确定。 – ForceBru
确实。它是“ark”(kde归档程序),无法正确打开或提取它。在命令行和文件滚轮工作上“解压缩”就好了。另一方面,方舟处理其他文本文件的zip文件没有任何问题。 – allo