当前位置: 首页 > 知识库问答 >
问题:

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

魏英勋
2023-03-14
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

记事本++能够毫无问题地打开文件。我做错了什么?

更新:在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和其他一些选项,但再次没有成功:(

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)
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
㯎㮵㯎㮻㯎㮻㯎㮷㯎㮽㯎㮹㯎઺ελληνικά딊묃묃뜃봃뤃먃갃㈃딻묃묃뜃봃뤃먃갃㈃

共有1个答案

齐飞星
2023-03-14

使用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首先写入文件。

编辑:

# -*- 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()
 类似资料:
  • 我在PHP中使用fputcsv创建了一个CSV文件。文件创建成功,我可以在MacOS中打开文件,没有问题。(我在MacOS中使用数字)。问题是在微软的Excel中,它将所有行显示为合并的一列。 我在代码中将分隔符设置为“;”。 当我按照Microsoft文档中的说明检查语言和区域设置时,分隔符也是“;”。 我还应该检查什么?非常感谢。

  • 问题内容: 我正在尝试在NetBeans 6.0.1中使用OpenCSV解析.csv文件。我的文件包含一些Unicode字符。当我在输出中写入字符时,字符以其他形式显示,例如(HJ1’-E /;)。当我在记事本中打开此文件时,它看起来还可以。 我使用的代码: 问题答案: 首先,您需要知道文件的编码格式,例如UTF-8或UTF-16。生成此文件的原因是什么? 在那之后,它相对简单- 您需要创建一个包

  • 我新安装了Excel 2016,它讨厌CSV文件。它以一栏旗杆风格打开它们,沿着A栏向下,可以看到逗号和语音标记。 突出点: > 我可以在笔记本电脑上创建CSV文件,保存这些文件,然后在笔记本电脑上再次打开它们,一切正常。 即使在记事本中打开它,保存下来,希望某种文件格式正常化,但仍然没有什么好处。 我比较了区域设置和Excel中几乎所有的设置。 我尝试将文件重命名为TXT,它打开了文本文件转换对

  • 问题内容: 我刚刚了解到MySQL具有本地CSV存储引擎,该引擎将数据存储在每个表的逗号分隔值文件中。 是否可以直接从上传的CSV文件创建表格,例如: 用户在哪里上传? 问题答案: 这不可能。要创建表,您需要一个表架构。您拥有的是一个数据文件。无法使用它创建模式。 您可以做的是检查文件中是否有标题行,在这种情况下,您可以使用该标题行手动创建表。 但是,有一种使用批处理文件生成create tabl

  • 我有一个由几张纸组成的excel文件。我需要分别将它们作为单独的数据帧加载。与pd类似的功能是什么。对于此类任务,请阅读“\u csv”(“”)? 附注:由于大小,我不能在excel中复制和粘贴单独的工作表

  • 问题内容: (如果我错过了任何重复的内容,请随时向我指出) 我查看了以下代码段:http : //djangosnippets.org/snippets/365/ 和这个答案: 但是我不知道如何调整它们以适应我的需要:我想压缩多个文件,并希望通过链接(或通过视图动态生成)下载存档。我是Python和Django的新手,所以我不知道该怎么做。 预先感谢! 问题答案: 我已经在Willy链接到的重复问