Pandas.read_csv()如何处理列名中包含特殊字符(重音符号)的情况?

33

我有一个包含列名的csv文件:

  • "PERIODE"
  • "IAS_brut"
  • "IAS_lissé"
  • "Incidence_Sentinelles"

我遇到了第三个问题,"IAS_lissé"pd.read_csv()方法错误解释并返回为�。

那是什么字符?

因为它在我的Flask应用程序中产生了错误,请问有没有一种方法可以以不修改文件的方式读取该列?

In [1]: import pandas as pd

In [2]: pd.read_csv("Openhealth_S-Grippal.csv",delimiter=";").columns

Out[2]: Index([u'PERIODE', u'IAS_brut', u'IAS_liss�', u'Incidence_Sentinelles'], dtype='object')

看起来Pandas无法处理列名中的Unicode字符。尝试将列名转换为ASCII。请注意,您将失去重音。 - Sohier Dane
上面的评论是不正确的,也不是发布时的真实情况 - 请查看下面任何一个答案以了解处理非ASCII字符的正确方法(通常是通过将编码设置为utf-8或latin1)。 - bsplosion
4个回答

29

我发现了和西班牙语相关的相同问题,使用"latin1"编码解决了这个问题:

import pandas as pd

 pd.read_csv("Openhealth_S-Grippal.csv",delimiter=";", encoding='latin1')
希望能对你有所帮助!

2
Latin1编码也适用于德语umlauts(utf8不行)。谢谢! - Unis
工作了!谢谢。 - max
1
谢谢!这解决了我在为巴西客户导入数据时遇到的问题! - Brian Keith
还有其他可能的编码方式吗?我刚使用了它,但重音符号显示为这样:“Escand�n” - Alex Ruiz

13
你可以更改 read_csvencoding 参数,有关详细信息,请参阅 pandas 文档此处。此外,Python 标准编码在此处提供。
我认为对于你的示例,你可以使用 utf-8 编码(假设你的语言是法语)。
df = pd.read_csv("Openhealth_S-Grippal.csv", delimiter=";", encoding='utf-8')

以下是一个示例,展示了一些样本输出。我所做的只是使用问题字符创建了一个只有一列的csv文件。

df = pd.read_csv('sample.csv', encoding='utf-8')

输出:

    IAS_lissé
0   1
1   2
2   3

哎呀!我遇到了一个错误(同样的错误)'utf8'编解码器无法解码第8个字节0xe9:数据意外结束 - farhawa
11
这是因为您的数据没有编码为utf-8。尝试使用latin1pd.read_csv("Openhealth_S-Grippal.csv", delimiter=";", encoding='latin1') - Kartik
是的,一开始我使用的是 latin1,但后来改成了 utf-8。@farhawa,如果你想要更好的答案,可以发布你的 CSV 文件或其中的一个样本,并包含文件头,这样我们就知道你的编码方式是什么。 - shawnheide

11

尝试使用以下方法:

import pandas as pd    
df = pd.read_csv('file_name.csv', encoding='utf-8-sig')

1
这对我起作用了。UTF-8没有出错,但它把“é”变成了“é”。Latin1不起作用,它在“ś”上抛出一个错误。 - jeffsdata

4
使用utf-8对我无效。例如,以下这段代码:
    bla = pd.DataFrame(data = [1, 2])
    bla.to_csv('funkyNamé , things.csv')
    blabla = pd.read_csv('funkyNamé , things.csv', delimiter=";", encoding='utf-8')
    blabla 

最终返回:OSError:从文件初始化失败
我知道你说你不想修改文件。如果你指的是文件内容而不是文件名,我会将文件重命名为没有重音符号的名称,使用新名称读取csv文件,然后将文件名恢复为原始名称。
    originalfilepath = r'C:\Users\myself\\funkyNamé , things.csv'
    originalfolder = r'C:\Users\myself'
    os.rename(originalfilepath, originalFolder+"\\tempName.csv")
    df = pd.read_csv(originalFolder+"\\tempName.csv", encoding='ISO-8859-1')
    os.rename(originalFolder+"\\tempName.csv", originalfilepath)

如果您的意思是“不修改文件名称”,那么很抱歉我没有对您有所帮助,但我希望这能帮到其他人。

1
谢谢。使用“ISO-8859-1”编码对我很有帮助。我的数据中包含井号、分号等字符。 - Abhishek Pansotra

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