當我使用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