Django创建包含Unicode并且可以直接用Excel打开的CSV文件

2023-11-23

我想通过 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,我真的尝试过一切在writer的编码参数中,包括utf-8,utf-8-sig,utf-8-le,utf-16-le,也许还有其他。每次我用 Excel 打开文件时,我总是在希腊字符应该在的地方看到垃圾。

Notepad++ 能够毫无问题地打开该文件。我究竟做错了什么 ?

更新:这是我在 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(作为垃圾) - 我也尝试使用 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 行完全一样,没有产生希腊字符 $^#$#^$#$#^ @@%$#^#^$#$ 请帮忙!


与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首先写入你的文件。

Edit:

以下是一些使用非 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django创建包含Unicode并且可以直接用Excel打开的CSV文件 的相关文章

随机推荐