我必须匹配CSV和JSON文件中的数据。 除了从文件中读“科特迪瓦”时,一切都有效。我必须根据国家/地区名称匹配数据。
使用以下代码从CSV读取时:
dataframe = pandas.read_csv(filename)
我得到“科特迪瓦”
"CIV","Côte d'Ivoire",1 ----line in csv file
但是当使用以下代码从JSON文件中读取时:
json_data = json.loads(open(filename).read())
我得到“科特迪瓦”
{
"label": "CIV",
"display": "Côte d'Ivoire",
"display_sequence": 1
} ---- block in json file
所以现在当我比较他们完成匹配的字符串时,我喜欢一个国家的数据。我用notepad ++打开了csv和json文件,看到它们都包含“Côted'Ivoire”。
我知道这可能是一个编码问题,所以我想知道如何读取JSON文件,以便正确读取此字符串。
答案 0 :(得分:5)
从那种乱码中,我看到你正在读一个UTF-8文件,而系统上的默认编码是Latin1或windows-1252(很可能是后者,因为几年来大多数UNIX系统默认为UTF -8,在Windows上,windows-1252比非常相似的Latin1更受欢迎。
现在,正在发生的事情是,默认情况下,当您在文本模式下打开文件时,Python 3“帮助”尝试使用本地编码对其进行解码,无论发生什么情况。
我们在这里想要的是读取原始字节并使用正确的编码对它们进行解码。因此,我们必须以二进制模式打开文件,使用byte
现在返回的read
对象,并使用正确的编码decode
,以获得str
我们可以使用。
json_data = json.loads(open(filename, "rb").read().decode('utf-8'))
所以,这主要是为了理解从字节到unicode字符串所涉及的步骤; Python 3幸运地提供了一种更简单的方法:在文本模式中,您可以指定要使用的编码而不是默认编码。所以,我们可以回到更简单的
json_data = json.loads(open(filename, encoding='utf-8').read())
这也比上面的代码段更有效,因为转换是在读取时执行的,而不是必须转换整个大字符串。
这里要记住的一个棘手的问题是read
在以二进制模式打开文件时返回byte
对象(因此您必须手动decode
到{ {1}}如果要将其解释为文本数据),或者在文本模式下打开它时已经解码的str
对象。在最后一种情况下,你的文件是python认为默认编码是什么,或者你必须明确指定正确的编码,否则你将读取垃圾。