Reputation: 12459
The following code results in the file found in the zip being empty, instead of having some text
in it:
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)
Upvotes: 1
Views: 52
Reputation: 12459
Add flush
to the file object:
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)
This problem also affects normal (non-temporary) files, so they'll also need the flush
treatment:
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)
Alternatively, de-denting the 2nd with
block would avoid having to use flush
since a file gets closed automatically when that block exits, increasing the chance of it being flushed:
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)
Note that this will only work for the 2nd example, but not the 1st; see tempfile docs for the reason why.
Upvotes: 1