Skip to content

Commit 1f74c94

Browse files
committed
BUG: GH17778 - DataFrame.to_pickle() fails for .zip format.
1 parent 15fa4bd commit 1f74c94

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

pandas/io/common.py

+13-10
Original file line numberDiff line numberDiff line change
@@ -357,17 +357,20 @@ def _get_handle(path_or_buf, mode, encoding=None, compression=None,
357357
# ZIP Compression
358358
elif compression == 'zip':
359359
import zipfile
360-
zip_file = zipfile.ZipFile(path_or_buf)
361-
zip_names = zip_file.namelist()
362-
if len(zip_names) == 1:
363-
f = zip_file.open(zip_names.pop())
364-
elif len(zip_names) == 0:
365-
raise ValueError('Zero files found in ZIP file {}'
366-
.format(path_or_buf))
360+
if mode == 'wb':
361+
f = zipfile.ZipFile(path_or_buf, 'w')
367362
else:
368-
raise ValueError('Multiple files found in ZIP file.'
369-
' Only one file per ZIP: {}'
370-
.format(zip_names))
363+
zip_file = zipfile.ZipFile(path_or_buf)
364+
zip_names = zip_file.namelist()
365+
if len(zip_names) == 1:
366+
f = zip_file.open(zip_names.pop())
367+
elif len(zip_names) == 0:
368+
raise ValueError('Zero files found in ZIP file {}'
369+
.format(path_or_buf))
370+
else:
371+
raise ValueError('Multiple files found in ZIP file.'
372+
' Only one file per ZIP: {}'
373+
.format(zip_names))
371374

372375
# XZ Compression
373376
elif compression == 'xz':

pandas/io/pickle.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,15 @@ def to_pickle(obj, path, compression='infer', protocol=pkl.HIGHEST_PROTOCOL):
4242
if protocol < 0:
4343
protocol = pkl.HIGHEST_PROTOCOL
4444
try:
45-
pkl.dump(obj, f, protocol=protocol)
45+
import zipfile
46+
if isinstance(f, zipfile.ZipFile):
47+
import tempfile
48+
tmp_file = tempfile.NamedTemporaryFile()
49+
pkl.dump(obj, tmp_file, protocol=protocol)
50+
tmp_file.seek(0)
51+
f.write(tmp_file.name)
52+
else:
53+
pkl.dump(obj, f, protocol=protocol)
4654
finally:
4755
for _f in fh:
4856
_f.close()

0 commit comments

Comments
 (0)