2015-09-19 27 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

相關問題