写使用熊猫Excelwriter StringIO对象?写使用熊猫Excelwriter Strin

2019-05-12 02:26发布

我可以通过一个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对象?

Answer 1:

虽然每个作家引擎的支持大熊猫有望在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文档。



Answer 2:

在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) - 不过说实话有在更新路径属性这么少参与,我投给你看最简单的方式,而不是去稍长的路线。



Answer 3:

对于那些不使用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方法像往常一样!



文章来源: Write to StringIO object using Pandas Excelwriter?