Похожая проблема, и кажется, что 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
создает invalid external_attr, когда первым аргументом является str.
Это может быть
0o100xxx (regular file with umasked permission)
или
zero (as the spec)
но не
0oxxx (file type absent)
Это хорошо работает для меня. – ForceBru
Действительно. Это «ark» (программа архива kde), которая не может открыть или извлечь ее правильно. «разархивировать» на командной строке, а файл-ролик - отлично. С другой стороны, ark обрабатывает другие zip-файлы с текстовыми файлами внутри без каких-либо проблем. – allo