6

我想通过 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,我真的尝试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 行,完全一样的并没有给我生成希腊字符 $^#$#^$#$#^ @@%$#^#^$#$ 请帮忙!

4

2 回答 2

12

使用 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()
于 2012-06-01T07:29:04.157 回答
1

I've never been able to open a UTF-8-encoded (CSV) file in Excel. The only way I managed to make Excel import files properly was with UTF-16LE. YMMV.

EDIT

First

writer.writerow(codecs.BOM_UTF16_LE)

Then (as many times as required; str is the string to encode and write)

writer.writerow(str.decode('utf8').encode('utf_16_le'))
于 2012-06-01T07:45:39.147 回答