以下代码会导致 zip 中找到的文件为空,而不是其中包含一些文本
:
def func(path):
with tempfile.NamedTemporaryFile() as f:
f.write('some text')
with zipfile.ZipFile(path + '.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
zf.write((f.name), path)
最佳答案
将flush
添加到文件对象:
def func(path):
with tempfile.NamedTemporaryFile() as f:
f.write('some text')
f.flush() # <-- lifesaver
with zipfile.ZipFile(path + '.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
zf.write((f.name), path)
此问题也会影响正常(非临时)文件,因此它们也需要 flush
处理:
def func(path):
with open(path, 'w') as f:
f.write('some text')
f.flush() # <-- lifesaver
with zipfile.ZipFile(path + '.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
zf.write(path)
或者,消除第二个 with
block 的凹痕将避免使用 flush
,因为当该 block 退出时文件会自动关闭,从而增加了它被刷新的机会:
def func(path):
with open(path, 'w') as f:
f.write('some text')
with zipfile.ZipFile(path + '.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
zf.write(path)
请注意,这仅适用于第二个示例,不适用于第一个示例;请参阅tempfile docs究其原因。
关于python - ZipFile 不在存档文件内存储任何文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25467647/