在 Excel 中正确呈现 Flask 生成的 CSV 文件

use*_*375 2 python csv excel flask

这是 Flask 视图的一个最小示例,它生成 CSV (python 2.7)。

\n\n
# -*- coding: utf-8 -*-\n\nimport csv\nimport StringIO\n\nfrom flask import Flask, Response\n\napp = Flask(__name__)\n\n\n@app.route('/example.csv')\ndef example_csv():\n    f = StringIO.StringIO()\n    writer = csv.writer(f)\n    writer.writerow(['Header 1', 'Header 2', 'Header 3'])\n    writer.writerows([unicode(_).encode('utf-8') for _ in row] for row in (['1', '2', '3'], \n                                                                           ['a', 'b', 'c'],\n                                                                           [u'\xc2\xa3', u'\xe2\x82\xac', u'\xc2\xa5']))\n    response = Response(f.getvalue(), mimetype='text/csv')\n    response.headers['Content-Disposition'] = u'attachment; filename=example.csv'\n    return response\n\n\nif __name__ == '__main__':\n     app.run(debug=True)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Excel 中打开给出:

\n\n
Header 1    Header 2    Header 3\n1   2   3\na   b   c\n\xc3\x82\xc2\xa3  \xc3\xa2\xe2\x80\x9a\xc2\xac \xc3\x82\xc2\xa5\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用 Apple 的 Numbers 应用程序,最后一行可以正确呈现。如何让 Excel 正确呈现?我是否缺少某种编码设置?

\n

Sea*_*ira 5

是否可以强制 Excel 自动识别 UTF-8 CSV 文件?表明问题在于 Excel 不会将文件视为 UTF-8,除非该文件以字节顺序标记开头(出于与其先前行为的向后兼容性的原因)。

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

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

或者,第一个答案表明,如果这不起作用,则以 UTF- 16形式传送内容通常会起作用(但即使如此,也并非适用于每个版本的 Excel)。