Python 在Excel中正确呈现烧瓶生成的CSV文件

Python 在Excel中正确呈现烧瓶生成的CSV文件,python,excel,csv,flask,Python,Excel,Csv,Flask,下面是一个烧瓶视图的最小示例,它生成一个CSV(python 2.7) 在Excel中打开可以提供: Header 1 Header 2 Header 3 1 2 3 a b c £ € Â¥ 使用苹果的数字应用程序,最后一行可以正确渲染。如何让Excel正确渲染?我是否缺少某种编码设置?表明,问题是Excel不考虑文件是UTF-8,除非它以字节顺序标记开始(由于与先前行为的向后兼容性)。 尝试将编码的BOM表添加为响应的前三个字节: response =

下面是一个烧瓶视图的最小示例,它生成一个CSV(python 2.7)

在Excel中打开可以提供:

Header 1    Header 2    Header 3
1   2   3
a   b   c
£  € ¥
使用苹果的数字应用程序,最后一行可以正确渲染。如何让Excel正确渲染?我是否缺少某种编码设置?

表明,问题是Excel不考虑文件是UTF-8,除非它以字节顺序标记开始(由于与先前行为的向后兼容性)。 尝试将编码的BOM表添加为响应的前三个字节:

response = Response(u'\uFEFF'.encode('utf-8') + f.getvalue(), mimetype='text/csv')
备选地,第一个答案表明,如果这不起作用,将内容作为UTF- <强> 16 通常会起作用(但不是针对Excel的每一个版本,即使是这样).E/P>

表明,Excel不认为文件是UTF-8,除非它以字节顺序标记开始。(由于与以前的行为向后兼容的原因)

尝试将编码的BOM表添加为响应的前三个字节:

response = Response(u'\uFEFF'.encode('utf-8') + f.getvalue(), mimetype='text/csv')

或者,第一个答案表明,如果这不起作用,那么以UTF-16的形式发送内容通常会起作用(但即使是这样,也不适用于所有版本的Excel)。

尝试使用带有签名的UTF-8,因此将“UTF-8”替换为“UTF-8-sig”应该会起作用


在您的代码中:unicode(\).encode('utf-8-sig')

尝试使用带有签名的utf-8,因此用“utf-8-sig”替换“utf-8”应该可以

在您的代码中:unicode(41;).encode('utf-8-sig')

这对我很有用:

导入编解码器
从flask import作出响应
输出=作出响应(
codecs.BOM_UTF8.decode(“UTF8”)+codecs.BOM_UTF8.decode()+f.getvalue())
output.headers[“内容处置”]=“附件;文件名=export.csv”
output.headers[“内容类型”]=“文本/csv”
返回输出
这对我很有用:

导入编解码器
从flask import作出响应
输出=作出响应(
codecs.BOM_UTF8.decode(“UTF8”)+codecs.BOM_UTF8.decode()+f.getvalue())
output.headers[“内容处置”]=“附件;文件名=export.csv”
output.headers[“内容类型”]=“文本/csv”
返回输出

查看请求此端点时返回的标题,
内容类型是否设置为
text/csv;charset=utf-8
?是,➜ ~ curl-v*尝试127.0.0.1…*连接到127.0.0.1(127.0.0.1)端口5000(#0)>GET/example.csv HTTP/1.1>主机:127.0.0.1:5000>用户代理:curl/7.43.0>接受:/>*HTTP 1.0,假设正文后关闭内容类型是否设置为
text/csv;字符集=utf-8
?是,➜ ~ curl-v*尝试127.0.0.1…*连接到127.0.0.1(127.0.0.1)端口5000(#0)>GET/example.csv HTTP/1.1>主机:127.0.0.1:5000>用户代理:curl/7.43.0>接受:/>*HTTP 1.0,假设正文后关闭响应中添加
字符集='utf-16'
关键字参数,并更改
编码('utf-8')
encode('utf-16')
响应不接受字符集参数。更改encode()对utf-16给出:标题1标题2标题3ÿ1ÿ2ÿ3ÿaÿbÿcÿ255; 2ÿ2ÿ2ÿ2ÿ2ÿ3ÿcÿ2ÿcÿ2ÿ2ÿ3ÿcÿ3ÿcÿcÿ2ÿ2ÿcÿcÿ2ÿcÿ2ÿcÿcÿÿcÿ225nge
encode('utf-8')
encode('utf-16')
响应不接受字符集参数。将encode()更改为utf-16将给出:头1头2头3ÿ1ÿ2ÿ3ÿaÿbÿcÿ