我可以通过一个StringIO对象以pd.to_csv()就好了:
io = StringIO.StringIO()
pd.DataFrame().to_csv(io)
但是,使用Excel时,作家,我有很多的麻烦。
io = StringIO.StringIO()
writer = pd.ExcelWriter(io)
pd.DataFrame().to_excel(writer,"sheet name")
writer.save()
返回一个
AttributeError: StringIO instance has no attribute 'rfind'
我试图创建一个ExcelWriter
无需调用对象pd.ExcelWriter()
但我遇到了一些麻烦。 这是我到目前为止已经试过:
from xlsxwriter.workbook import Workbook
writer = Workbook(io)
pd.DataFrame().to_excel(writer,"sheet name")
writer.save()
但现在我得到一个AttributeError: 'Workbook' object has no attribute 'write_cells'
我怎样才能在Excel格式的数据帧大熊猫保存到一个StringIO
对象?
虽然每个作家引擎的支持大熊猫有望在ExcelWriter构造一个文件名路径StringIO
。 或许应该提高作为大熊猫的错误/功能请求。
在这里同时是利用熊猫一种变通方法例如xlsxwriter
引擎:
import pandas as pd
import StringIO
io = StringIO.StringIO()
# Use a temp filename to keep pandas happy.
writer = pd.ExcelWriter('temp.xlsx', engine='xlsxwriter')
# Set the filename/file handle in the xlsxwriter.workbook object.
writer.book.filename = io
# Write the data frame to the StringIO object.
pd.DataFrame().to_excel(writer, sheet_name='Sheet1')
writer.save()
xlsx_data = io.getvalue()
更新 :由于熊猫0.17的,现在可以更直接地做到这一点:
# Note, Python 2 example. For Python 3 use: output = io.BytesIO().
output = StringIO.StringIO()
# Use the StringIO object as the filehandle.
writer = pd.ExcelWriter(output, engine='xlsxwriter')
另请参见保存数据帧输出到一个字符串在XlsxWriter文档。
在pandas.io.excel源一眼看起来像它不应该是太大的问题,如果你不介意使用xlwt为您的作家。 其他引擎可能不是所有的困难,但无论是跳跃xlwt出来容易,因为它的保存方法接受一个流或文件路径。
您需要首先通过在文件名只是为了让大熊猫高兴,因为它会针对发动机文件扩展名,以确保它支持的格式。 但在xlwt发动机的情况下,它只是充塞文件名到对象的路径属性,然后使用它的保存方法。 如果更改路径属性到您的流,它会高兴地保存到流时调用保存方法。
下面是一个例子:
import pandas as pd
import StringIO
import base64
df = pd.DataFrame.from_csv('http://moz.com/top500/domains/csv')
xlwt_writer = pd.io.excel.get_writer('xlwt')
my_writer = xlwt_writer('whatever.xls') #make pandas happy
xl_out = StringIO.StringIO()
my_writer.path = xl_out
df.to_excel(my_writer)
my_writer.save()
print base64.b64encode(xl_out.getvalue())
这就是快速,简单和轻度污染的方式来做到这一点。 BTW ...更清洁的方式做到这一点是继承ExcelWriter(或它的一个子类存在,如_XlwtWriter) - 不过说实话有在更新路径属性这么少参与,我投给你看最简单的方式,而不是去稍长的路线。
对于那些不使用xlsxwriter
作为他们的engine=
为to_excel
这里是使用的解决方案openpyxl
内存:
in_memory_file = StringIO.StringIO()
xlw = pd.ExcelWriter('temp.xlsx', engine='openpyxl')
# ... do many .to_excel() thingies
xlw.book.save(in_memory_file)
# if you want to read it or stream to a client, don't forget this
in_memory_file.seek(0)
解释: ExcelWriter
包装类暴露引擎通过个人工作簿.book
财产。 对于openpyxl
然后你可以使用Workbook.save
方法像往常一样!