【发布时间】: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 分钟内就搞定了!!!
标签: python django excel unicode csv