UTF-8编码的csv文件在Excel中出现问题

10

编辑:

如建议所述,如果我使用notepad ++打开csv文件,则特殊字符会正确显示。当我将csv文件导入excel时,它们也会正确显示。 如何生成一个csv文件,在Excel中打开时能够正确显示,因为文件导入不是用户的选择。

我正在生成一个csv文件,该文件将在Excel中进行处理。 当使用Excel打开文件时,“é”等特殊字符无法正确显示。 enter image description here

这是我用来生成csv文件的POC。

# -*- coding: utf-8 -*-
import unicodecsv as csv
import codecs
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
def write_csv(file,headers):


    resultFile =codecs.open(file, "w+", "utf-8")

    #headers=[s.encode('utf-8') for s in headers]
    wr = csv.writer(resultFile, dialect='excel',delimiter=";",encoding="utf-8")
    wr.writerow(headers)

    resultFile.close()

headers=[""]
headers.append("Command")
headers.append("Vérification".encode('utf-8'))
write_csv(r"C:\test2.csv",headers)

你尝试用文本编辑器打开文件而不是Excel了吗?如果它没有出现这些(é)符号,那么你只需要在Excel中正确地导入文件即可。不要双击文件,而是打开一个空白文档,在功能区的数据选项卡中选择“从文本导入”,按照对话框指示操作。重要的是要设置正确的编码(在选择要导入的文件后)。 - Casper
请查看编辑。 - isoman
在这种情况下,请查看此问题:http://superuser.com/questions/911369/change-default-encoding-of-excel-to-utf-8 - Casper
在不期望出现问题的情况下,请删除 sys.setdefaultencoding("utf-8") 行。您不需要它。 - Alastair McCormack
生成一个Excel文件不是比那个烦人的CSV格式更容易吗? - RemcoGerlich
3个回答

17

在Python3中,我只需要这样做:

with open(file, "w+", encoding='utf-8-sig') as f:
                f.write("Vérification")

很简单,对吗? :) 你可以在Python文档中搜索 "utf-8-sig"


1
救了我的命!适用于拉丁字符,如 ç、á、é、í,完美无缺。 - Michel Fernandes

8

使用unicodecsv的Python 2解决方案。请注意unicodecsv的文档说应该以二进制模式(wb)打开模块。确保编写Unicode字符串。#coding需要支持源文件中的非ASCII字符。确保将源文件保存为UTF-8。

#coding:utf8
import unicodecsv

with open('test.csv','wb') as f:
    # Manually encode a BOM, utf-8-sig didn't work with unicodecsv
    f.write(u'\ufeff'.encode('utf8'))
    w = unicodecsv.writer(f,encoding='utf8')
    # Write Unicode strings.
    w.writerow([u'English',u'Chinese'])
    w.writerow([u'American',u'美国人'])
    w.writerow([u'Chinese',u'中国人'])

Python 3的解决方案。#coding在此处是可选的,因为它默认为UTF-8。只需确保将源文件保存为UTF-8即可。unicodecsv不再需要。内置的csv可以正确工作。csv文档说明要使用newline=''打开文件。
#coding:utf8
import csv

with open('test.csv','w',newline='',encoding='utf-8-sig') as f:
    w = csv.writer(f)
    # Write Unicode strings.
    w.writerow([u'English',u'Chinese'])
    w.writerow([u'American',u'美国人'])
    w.writerow([u'Chinese',u'中国人'])

4
我使用UTF-8 BOM编码解决了这个问题。
# -*- coding: utf-8-sig-*-
import unicodecsv as csv
import codecs
import sys
reload(sys)
sys.setdefaultencoding("utf-8-sig")
def write_csv(file,headers):


    resultFile =codecs.open(file, "w+", "utf-8-sig")

    #headers=[s.encode('utf-8') for s in headers]
    wr = csv.writer(resultFile, dialect='excel',delimiter=";",encoding="utf-8-sig")
    wr.writerow(headers)

    resultFile.close()

headers=[""]
headers.append("Command")
headers.append("Vérification")
write_csv(r"C:\Users\ATHENA-HDA\AppData\Local\Temp\test2.txt",headers)

1
过度杀伤力。不需要使用reload(sys)技巧,可能会导致错误。请参考:为何setdefaultencoding会破坏代码#coding语句声明源文件的编码,所以希望你将源文件保存为UTF-8带BOM格式。csv.writer不支持encoding参数。实际上,在Python 2中,csv不直接支持编码(请查看csv文档以获取解决方法)。在Python 3中,只需使用指定的编码打开文件即可。 - Mark Tolonen
在 Excel 中正确打开 CSV 的解决方案是添加 BOM。 - Mark Tolonen
抱歉,我没有看到你在使用unicodecsv。我的有关csv.writer的评论是针对内置的csv模块的。 - Mark Tolonen
这个例子在其他地方都能运行,但在我的 Mac 的 Excel 应用程序上却不能。 - Ricky Levi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接