我想在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'
答案 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