使用Pandas Excelwriter写入到StringIO对象?

我可以传递一个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' 

我正在尝试创build一个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格式的pandas数据StringIO保存到StringIO对象?

pandas期望ExcelWriter构造函数的文件名path,尽pipe每个写入器引擎都支持StringIO 。 也许这应该在Pandas中作为bug /function请求提出。

与此同时,这是一个使用Pandas xlsxwriter引擎的解决scheme示例:

 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() 

更新 :从Pandas 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文档中将Dataframe输出保存为string 。

看着pandas.io.excel源代码看起来应该不会太麻烦,如果你不介意使用xlwt作为你的作者。 其他的引擎可能不是那么困难,但是xlwt跳转很容易,因为它的save方法需要一个stream或一个文件path。

你只需要传入一个文件名就可以让大pandas快乐起来,因为它会根据引擎检查文件扩展名,以确保它是支持的格式。 但是在xlwt引擎的情况下,它只是将文件名填充到对象的path属性中,然后在save方法中使用它。 如果将path属性更改为stream,则在调用save方法时,它将愉快地保存到该stream中。

这是一个例子:

 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()) 

这是快速,简单,稍微肮脏的方法来做到这一点。 顺便说一句,一个更清洁的方式来做到这一点是子类ExcelWriter(或其现有的子类之一,如_XlwtWriter) – 但老实说,更新path属性很less涉及,我投票给你看简单的方法,而不是稍长的路线。

对于那些不使用xlsxwriter作为他们的engine= to_excel这里是在内存中使用openpyxl的解决scheme:

 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方法!