Django创build包含Unicode的CSV文件,可以直接用Excel打开
我想通过Django创build一个包含unicode数据(希腊字符)的CSV文件,我希望它可以直接从MS Excel打开。 在其他地方,我已经读了关于unicodecsv库,我决定使用它。 所以,这是我的观点。
def get_csv(request,id): response = HttpResponse(mimetype ='text / csv') response ['Content-Disposition'] ='attachment; 文件名= csv.csv” writer = unicodecsv.writer(response,encoding ='utf-16'') writer.writerow(['Second row','A','B','C',''Testing'','ελληνικά']) 返回响应
现在,除了utf-16之外,我真的已经在编写器的编码参数中尝试了一切 ,包括utf-8,utf-8-sig,utf-8-le,utf-16-le等。 每次我用excel打开文件,我总是看到希腊字符应该出现的垃圾。
记事本++能够打开文件没有问题。 我究竟做错了什么 ?
更新:这是我在jd的回答后所尝试的:
导入csv response = HttpResponse(mimetype ='text / csv') response ['Content-Disposition'] ='attachment; 文件名= test.csv” 的Response.Write(U '\ ufeff'.encode(' utf-8' )) writer = csv.writer(response,delimiter =';',dialect ='excel') writer.writerow(['Second row','A','B','C',''Testing'','ελληνικά']) 返回响应
仍然没有运气 – 现在我也可以看到在Excel中的BOM(作为掠食者) – 我也尝试使用unicodecsv和一些其他选项,但再次nothign工作:(
更新2:我在dda的build议之后尝试了这个:
writer = unicodecsv.writer(response,delimiter =';',dialect ='excel') writer.writerow(codecs.BOM_UTF16_LE) writer.writerow([(u'ελληνικά')。decode('utf8')。encode('utf_16_le')])
仍然没有运气:(这是我得到的错误:
UnicodeEncodeError在/ csv / 559 '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 decode('utf8')。encode('utf8')。encode('utf_16_le'),('ελληνικά2')。decode('utf8')。encode('utf_16_le')])#B
这里是Excel的内容:
㯎㮵㯎㮻㯎㮻㯎㮷㯎㮽㯎㮹㯎ελληνικά딊묃묃뜃봃뤃먃갃㈃딻묃묃뜃봃뤃먃갃㈃
所以我得到了#A的一些希腊字符。 但行B,这是exaclty相同的没有产生我希腊字符$ ^#$#^ $#$#^ @@%$#^#^ $#$ Pls hlep!
使用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()
我从来没有能够在Excel中打开一个UTF-8编码(CSV)文件。 我设法使Excel导入文件的唯一方法是使用UTF-16LE。 因人而异。
编辑
第一
writer.writerow(codecs.BOM_UTF16_LE)
然后(根据需要多次; str是编码和写入的string)
writer.writerow(str.decode('utf8').encode('utf_16_le'))