2015-09-19 23 views
0

当我使用zipfile.ZipFile.writestr时,文件后面包含正确数量的字符,但它们都是空字节。Python zipfile模块添加空字节而不是正确内容的文件

最少例如:

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

所得test.zip具有文件 “foo” 的内部,它包含4个空字节。

+0

这对我的作品确定。 – ForceBru

+1

确实。它是“ark”(kde归档程序),无法正确打开或提取它。在命令行和文件滚轮工作上“解压缩”就好了。另一方面,方舟处理其他文本文件的zip文件没有任何问题。 – allo

回答

0

似乎不是一个python问题,因为它是唯一的“方舟”,它不能打开这个文件。另一方面,它似乎是以某种方式编码的,方舟无法读取它(而其他解压缩程序可以)。

+0

接受它,因为方舟有问题,而不是一般的zipfile。如果有人知道,究竟是什么导致了这一点,以及如何构建所有归档程序正确处理的zip文件,我会接受你的答案。 – allo

+0

再次删除接受的属性,因为它似乎不清楚ark或zipfile是否是问题。 – allo

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说,如果内容是从stdin来到external_attr应设置为零。但是,当第一个参数是str时,writestr会构造一个invalid external_attr。

这可能是

0o100xxx (regular file with umasked permission) 

zero (as the spec) 

但不

0oxxx (file type absent) 
+0

那么这是一个python(zipfile模块)错误?为什么来自writestr的输入需要另一个处理而不是普通文件?它有一些属性,可以追加数据,当它包含为“文件”时不起作用,或者有什么推理?只是好奇而已。而在1096​​行''zinfo.external_attr = 0o600 << 16''看起来像有人有一个想法,他在做什么,但遗憾的是他没有记录为什么这样。 – allo

相关问题