"utf8"编码无法解码0xf3字节

13

我正在使用Python 2.7读取JSON文件。我的代码如下:

import json
from json import JSONDecoder
import os

path = os.path.dirname(os.path.abspath(__file__))+'/json'
print path

for root, dirs, files in os.walk(os.path.dirname(path+'/json')):
    for f in files:  
        if f.lower().endswith((".json")):
            fp=open(root + '/'+f)
            data = fp.read()
            print data.decode('utf-8')

但是我收到了以下错误消息:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf3 in position 72: invalid continuation byte

JSON被定义为使用UTF-8,但单独的0xF3字节在UTF-8多字节序列中是无效的。您的文件不是有效的UTF-8格式。常见的解决方法是强制使用不同的编码方式,通常是“latin-1”,但这基本上会产生错误的结果。如果您知道输入的实际编码方式,请尽管使用它。 - tripleee
请参考character-encoding标签的百科全书以获取相关背景和故障排除技巧。 - tripleee
为什么您要添加“/json”,然后使用os.path.dirname()将其删除,最后又再次添加回去呢? - tripleee
如果将该JSON添加进去,它将会进入JSON目录。 - Rajiv
有没有办法通过读取文件属性或其他方式来查找编码? - Rajiv
显示剩余3条评论
1个回答

27

您的文件未使用UTF-8编码,并且错误发生在fp.read()这行。您必须使用:

import io
io.open(filename, encoding='latin-1')

正确的、不依赖平台的路径连接方法是:

os.path.join(root, f)

谢谢您的回答。我会尝试一下。但是我有很多像这样的文件。我不能保证所有文件都是“拉丁文”。 - Rajiv
类型错误:'encoding'是此函数的无效关键字参数- 我得到的错误 - Rajiv
编码关键字是Python 3特有的。一个可移植的解决方案是使用FileIO.open() - tripleee
我的错,我没有注意到这是一个关于Python 2的问题。但是你只需要使用io.open()就可以了... - Arcturus B
是的,当我使用 io.open(finame, encoding="latin-1") 时它可以工作。 - Rajiv
显示剩余2条评论

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