Django创建包含Unicode的CSV文件,可以直接用Excel打开

Posted

技术标签:

【中文标题】Django创建包含Unicode的CSV文件,可以直接用Excel打开【英文标题】:Django create CSV file that contains Unicode and can be opened directly with Excel 【发布时间】:2012-06-06 10:48:06 【问题描述】:

我想通过 Django 创建一个包含 unicode 数据(希腊字符)的 CSV 文件,并且我希望它可以直接从 MS Excel 打开。在其他地方我读到了 unicodecsv 库,我决定使用它。所以,这是我的看法;

def get_csv(请求,id): 响应 = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = '附件;文件名=csv.csv' writer = unicodecsv.writer(response, encoding='utf-16"') writer.writerow(['第二行', 'A', 'B', 'C', '"测试"', "ελληνικά"]) 返回响应

现在,除了utf-16,我真的尝试了everything在writer的encoding参数中,包括utf-8, utf-8-sig, utf-8-le, utf-16 -le,也许还有其他人。每次我用 excel 打开文件时,我总是在希腊字符应该出现的地方看到垃圾。

Notepad++ 能够毫无问题地打开文件。我做错了什么?

更新:这是我在 jd 回答后尝试的:

导入 csv 响应 = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = '附件;文件名=test.csv' response.write(u'\ufeff'.encode('utf8')) writer = csv.writer(response, delimiter=';' , dialect='excel') writer.writerow(['第二行', 'A', 'B', 'C', '"测试"', "ελληνικά"]) 返回响应

仍然没有运气 - 现在我也可以在 Excel 中看到 BOM(作为抓取) - 我也尝试使用 unicodecsv 和其他一些选项,但再次没有任何效果:(

更新 2: 我在 dda 的提议后尝试了这个:

writer = unicodecsv.writer(response, delimiter=';' , dialect='excel') writer.writerow(codecs.BOM_UTF16_LE) writer.writerow([ (u'ελληνικά').decode('utf8').encode('utf_16_le')])

仍然没有运气:(这是我得到的错误:

/csv/559 处的 UnicodeEncodeError “ascii”编解码器无法对位置 0-7 中的字符进行编码:序数不在范围内(128)

更新 3: 我快疯了。为什么这么难???这是另一个尝试:

response.write(codecs.BOM_UTF16_LE) writer = unicodecsv.writer(response, delimiter=';' , lineterminator='\n', dialect='excel', ) writer.writerow('ελληνικ') writer.writerow([ ('ελληνικά').decode('utf8').encode('utf_16_le')]) #A writer.writerow([ ('ελληνικά2').decode('utf8').encode('utf_16_le'), ('ελληνικά2').decode('utf8').encode('utf_16_le') ]) #B

这是 Excel 的内容:

㯎㮵㯎㮻㯎㮻㯎㮷㯎㮽㯎㮹㯎઺ελληνικά딊묃묃뜃봃뤃먃갃㈃딻묃묃뜃봃뤃먃갃㈃

所以我得到了一些带有#A 行的希腊字符。但是 B 行,完全一样的并没有给我生成希腊字符 $^#$#^$#$#^ @@%$#^#^$#$ 请帮忙!

【问题讨论】:

您在 MacOS 上使用 Excel 吗? This SO answer 是我发现 BOM 技巧的地方,显然它不适用于 MacOS 的 Excel。 不,我正在使用 Excel for Windows :( (u'ελληνικά').decode('utf8').encode('utf_16_le'):你不应该解码一个 unicode 字符串。您只能对它们进行编码。 jd 你是对的,这就是为什么我删除了字符串前面的 'u'... 但是我仍然遇到问题,正如你在更新 3 中看到的那样 :( 请不要再为这个问题烦恼了,我最终使用了 xlwt !我也向大家推荐 - 我在 5 分钟内就搞定了!!! 【参考方案1】:

使用 Python 的 csv 模块,您可以编写一个 UTF-8 文件,如果您在文件开头放置 BOM,Excel 将正确读取该文件。

with open('myfile.csv', 'wb') as f:
    f.write(u'\ufeff'.encode('utf8'))
    writer = csv.writer(f, delimiter=';', lineterminator='\n', quoting=csv.QUOTE_ALL, dialect='excel')
    ...

同样适用于unicodecsv。我想您可以将 BOM 直接写入 HttpResponse 对象,如果没有,您可以使用 StringIO 先写入文件。

编辑:

这里有一些示例代码,它使用非 ASCII 字符编写 UTF-8 CSV 文件。为简单起见,我将 Django 排除在外。我可以在 Excel 中读取该文件。

# -*- coding: utf-8 -*-
import csv
import os
response = open(os.path.expanduser('~/utf8_test.csv'), 'wb')
response.write(u'\ufeff'.encode('utf8'))
writer = csv.writer(response, delimiter=';' , dialect='excel')
writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', u"ελληνικά".encode('utf8')])
response.close()

【讨论】:

好吧,我尝试了完全相同的代码,但我无法读取文件:(这怎么可能?我已经将它保存在 UTF-8 w/o BOM .py 中。我真的要疯了吗? ??? 当我用记事本++打开这个文件时它很好......这是我在Excel 2003中看到的内容:ο»Ώ第二行A B C“测试”ελληνικά 它对我不起作用。我在 Mac OS X 上使用 Office。不过,OpenOffice 可以毫无问题地打开文件。【参考方案2】:

我一直无法在 Excel 中打开 UTF-8 编码 (CSV) 文件。我设法正确导入 Excel 文件的唯一方法是使用 UTF-16LE。 YMMV。

编辑

第一

writer.writerow(codecs.BOM_UTF16_LE)

然后(根据需要多次;str 是要编码和写入的字符串)

writer.writerow(str.decode('utf8').encode('utf_16_le'))

【讨论】:

我不关心文件的实际编码。那么,如何输出以 UTF-16LE 编码的文件并能够用 excel 读取呢?

以上是关于Django创建包含Unicode的CSV文件,可以直接用Excel打开的主要内容,如果未能解决你的问题,请参考以下文章

htmljs简单实现含中文csv文件下载(后端为django)

导入CSV文件乱码

将 Unicode 文本文件导入 netezza 表

如何打开/ Python中转换CSV这样的字符串不是Unicode?

python 正则匹配 csv文件中特殊符号如■高风险 这样的black block

Django Admin——批量员工用户创建/从 CSV 文件导入