python – Django创建包含Unicode的CSV文件,可以直接用Excel打开
我想通过Django创建一个包含unicode数据(希腊字符)的CSV文件,我希望它可以直接从MS Excel打开.在其他地方,我读过有关unicodecsv库的内容,我决定使用它.所以,这是我的看法;
def get_csv(request,id): response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename=csv.csv' writer = unicodecsv.writer(response,encoding='utf-16"') writer.writerow(['Second row','A','B','C','"Testing"',"ελληνικ?"]) return response 现在,除了utf-16之外,我真的尝试过编写器的编码参数,包括utf-8,utf-8-sig,utf-8-le,utf-16-le和其他人.每当我用excel打开文件时,我总是看到希腊字符本应该存在的垃圾. 记事本能够毫无问题地打开文件.我究竟做错了什么 ? 更新:这是我在jd回答之后尝试的内容: import csv response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename=test.csv' response.write(u'ufeff'.encode('utf8')) writer = csv.writer(response,delimiter=';',dialect='excel') writer.writerow(['Second row',"ελληνικ?"]) return response 仍然没有运气 – 现在我也可以在Excel中看到BOM(作为垃圾) – 我也尝试使用unicodecsv和一些其他选项,但再次没有工作:( 更新2: writer = unicodecsv.writer(response,dialect='excel') writer.writerow(codecs.BOM_UTF16_LE) writer.writerow([ (u'ελληνικ?').decode('utf8').encode('utf_16_le')]) 仍然没有运气:(这是我得到的错误: UnicodeEncodeError at /csv/559 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128) 更新3: response.write(codecs.BOM_UTF16_LE) writer = unicodecsv.writer(response,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行,这是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,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,u"ελληνικ?".encode('utf8')]) response.close() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |