我想通过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', 'A', 'B', 'C', '"Testing"', "ελληνικά"]) return response
仍然没有运气-现在我也可以在Excel中看到BOM(作为grabage)-我也尝试使用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')])
仍然不走运:(这是我得到的错误:
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, 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行,也就是说,它并没有产生希腊字符$^#$#^$#$#^@@@@@@@$$#^$#^$#$请处理!
我从未在Excel中打开过UTF-8编码(CSV)文件。我设法使Excel正确导入文件的唯一方法是使用UTF-16LE。YMMV公司。
编辑
第一
然后(根据需要多次;str是要编码和写入的字符串)
使用Python的
csv
模块,您可以编写一个UTF-8文件,如果将BOM放在文件的开头,Excel将正确读取该文件。这同样适用于
unicodecsv
。我想您可以直接将BOM写入HttpResponse
对象,如果不能,您可以使用StringIO
首先写入文件。编辑:
下面是一些用非ASCII字符编写UTF-8csv文件的示例代码。为了简单起见,我把Django从等式中去掉。我可以用Excel读取那个文件。
相关问题 更多 >
编程相关推荐