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'))