无法在缓冲区中压缩文件

时间:2019-06-03 04:10:54

标签: python zipfile

我想在Python中使用zipFile在(缓冲区)中压缩CSV文件

下面是我尝试并附上错误日志的代码

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 个答案:

答案 0 :(得分:1)

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问题,因为虽然“聪明”的解决方案似乎是一种快速的解决方法,但它们往往会带来可怕的technical debt,这可能会这将是一场噩梦。

答案 1 :(得分:0)

您正在将io.BytesIO()对象作为第一个参数传递给ZipFile.writestr(),在该参数中,它将要求使用存档名称或ZipInfo对象。

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

zinfo_or_arcname是将在   存档或ZipInfo实例。

来源:Docs