首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用向StringIO对象写入?

使用向StringIO对象写入?
EN

Stack Overflow用户
提问于 2015-01-21 02:21:36
回答 4查看 28.8K关注 0票数 21

我可以将一个StringIO对象传递给pd.to_csv(),很好:

代码语言:javascript
复制
io = StringIO.StringIO()
pd.DataFrame().to_csv(io)

但是当使用excel作者时,我遇到了更多的麻烦。

代码语言:javascript
复制
io = StringIO.StringIO()
writer = pd.ExcelWriter(io)
pd.DataFrame().to_excel(writer,"sheet name")
writer.save()   

返回

代码语言:javascript
复制
AttributeError: StringIO instance has no attribute 'rfind'

我试图在不调用ExcelWriter的情况下创建一个pd.ExcelWriter()对象,但遇到了一些问题。这就是我迄今为止尝试过的:

代码语言:javascript
复制
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对象?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-21 11:03:14

虽然每个编写引擎都支持ExcelWriter构造函数,但是熊猫希望有一个文件名路径。也许这应该作为Pandas中的一个bug/特性请求来提出。

同时,这里有一个使用Pandas xlsxwriter引擎的解决方案:

代码语言:javascript
复制
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()

更新:从Pandas0.17开始,现在可以更直接地这样做了:

代码语言:javascript
复制
# 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')

还请参阅将Dataframe输出保存为字符串文档中的XlsxWriter。

票数 42
EN

Stack Overflow用户

发布于 2020-12-15 21:30:50

这些都不是我干的。我有一个视图,我想从Django返回一个excel工作簿。我找到了我的解决方案从熊猫的文件里

代码语言:javascript
复制
import io
bio = io.BytesIO()
writer = pd.ExcelWriter(bio, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
writer.save()
bio.seek(0)

# BONUS CONTENT
# .. because I wanted to return from an api
response = HttpResponse(bio, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename=myfile.xlsx'
return response # returned from a view here

注意,我使用该值作为内容类型,因为根据mozzilla文档,它是mime类型。来自以下链接中的".xlsx“。视需要更换。类型

票数 8
EN

Stack Overflow用户

发布于 2015-01-21 04:59:45

如果您不介意使用xlwt作为您的作者,那么浏览pandas.io.excel源代码看起来应该不会有太大问题。其他引擎也可能没有那么困难,但是xlwt跳出来很容易,因为它的保存方法需要流或文件路径。

您需要首先传入一个文件名,以使熊猫高兴,因为它检查文件名扩展名与引擎,以确保它是一个受支持的格式。但是对于xlwt引擎,它只是将文件名填充到对象的path属性中,然后在save方法中使用它。如果将path属性更改为流,则在调用save方法时,它将很高兴地保存到该流。

下面是一个例子:

代码语言:javascript
复制
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属性几乎没有什么关系,我投票给您看的是简单的方法,而不是稍微长一些的路径。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28058563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档