Невозможно сжать файл в буфере - PullRequest
0 голосов
/ 03 июня 2019

Я хочу сжать файл CSV в (буфер), используя zipFile в Python

Ниже приведен мой код, который я пробовал, и журнал ошибок.

I Dont want to use the compression in df.to_csv due to Version issue 
import pandas as pd
import numpy as np
import io
import zipfile
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
s_buf = io.StringIO()
df.to_csv(s_buf,index=False)
s_buf.seek(0)
s_buf.name = 'my_filename.csv'
localfile= io.BytesIO()
localzip = io.BytesIO()
zf = zipfile.ZipFile(localzip, mode="w",compression=zipfile.ZIP_DEFLATED)
zf.writestr(localfile, s_buf.read())
zf.close()
with open("D:/my_zip.zip", "wb") as f:
    f.write(zf.getvalue())

Ошибка, которую я получаю

Traceback (most recent call last):
  File "C:/Users/Window/PycharmProjects/dfZip/dfZiptest.py", line 25, in <module>
    zf.writestr(localfile, s_buf.read())
  File "C:\Python\Python37\lib\zipfile.py", line 1758, in writestr
    date_time=time.localtime(time.time())[:6])
  File "C:\Python\Python37\lib\zipfile.py", line 345, in __init__
    null_byte = filename.find(chr(0))
AttributeError: '_io.BytesIO' object has no attribute 'find'

Ответы [ 2 ]

1 голос
/ 03 июня 2019
zf = zipFile.ZipFile("localzip.zip", mode="w", compression=zipfile.ZIP_DEFLATED)
zf.write(filename + '.cvs', s_buf.read())
zf.close

То, что вы здесь делаете, это

1 - вы инициализируете путь ZipFile

2 - вы просто передаете имя, а затем файл, которым хотите бытьзаписано в архив.В вашем случае вы передавали io.BytesIO() как имя, которое не имело смысла для Python, поэтому ошибка.

Я бы настоятельно советовал вам сначала разрешить любые Version проблемы, потому что пока «умный»решение может показаться быстрым выходом, они имеют тенденцию накапливать ужасный технический долг последний, с которым можно и будет кошмаром иметь дело.

0 голосов
/ 03 июня 2019

Вы передаете объект io.BytesIO () в качестве первого аргумента ZipFile.writestr (), где он ожидает либо имя архива, либо объект ZipInfo.

zf.writestr(localfile, s_buf.read())

zinfo_or_arcname либоимя файла, которое будет указано в архиве, или экземпляр ZipInfo.

источник: Документы

...