【问题标题】:UnicodeDecodeError reading a JSON fileUnicodeDecodeError 读取 JSON 文件
【发布时间】:2015-08-08 14:32:36
【问题描述】:

下面是我的代码的一部分,它给了我错误..

# get all browser products
raw_json_file = open( script_dir + "raw_json.js", 'r' )
raw_json = raw_json_file.read()
all_str = raw_json[ raw_json.find("{"): ]
all_obj = json.loads(all_str)
browser_products = all_obj["categories"]["6"]["products"]

我在这里遇到的错误如下:

C:\Python34>python parse.py 8.3.4
argument is 8.3.4
Traceback (most recent call last):
  File "parse.py", line 42, in <module>
    raw_json = raw_json_file.read()
  File "C:\Python34\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 563011: character maps to <undefined>

请告诉我如何解决这个错误。

【问题讨论】:

  • 您是否使用正确的映射创建了 JSON。 JSON Python,像这样。 object == dict, array == list, string == unicode, number (int) == int long, number (real) == float, true == True, false == False, null == None。
  • js 文件是 javascript。 json 是一个 json 文件。

标签: python json python-3.x


【解决方案1】:

当您在 Python 3 中使用 open() 时,默认情况下,它将假定文件以某些系统默认值编码,在您的情况下,它出现在 Windows cp1252 编码中。也许该文件实际上是以其他方式编码的,例如非常常见的 UTF-8
你可以试试

raw_json_file = open( script_dir + "raw_json.js", 'r', encoding='utf8' )

看看是不是这样,但实际上你需要询问提供文件的人他们使用了什么编码。

【讨论】:

    【解决方案2】:

    最好的方法是尝试编码和解码为utf-8

    # get all browser products
    raw_json_file = open( script_dir + "raw_json.js", 'r' )
    raw_json = bytes(raw_json_file.read()).decode()
    all_str = raw_json[ raw_json.find("{"): ]
    all_obj = json.loads(all_str)
    browser_products = all_obj["categories"]["6"]["products"]
    #Do this to the strings you get from the JSON file directly. Then, use them as needed. 
    

    计算机可以为某些字符赋予不同的代码和值,其中一个代码集是unicode。但是,这些不是普通字符串,因此您必须在使用它们之前在 Python 中转换它们。尝试查看This Article 了解更多信息。

    另外,您的文件不是 JSON 文件,而是用于开发网站的 JavaScript 编程语言文件。如果您没有提交,请确认您的文件的有效性。如果您自己制作文件,则无需担心。更改扩展名只是告诉您的计算机使用什么程序打开文件的一种方式。

    记住

    当我执行decode() 时,它会自动从utf-8 特征解码。如果您不知道文件的编码是什么,请尝试使用 pip 安装chardet 模块,并查看chardet documentation 的使用教程。一旦发现(有时,如果您的文件使用不同的字符集,chardet 将不起作用,您必须将所有编码更改为一种统一编码)编码,将其作为字符串参数添加到decode()

    对不起,如果这一切看起来势不可挡,但有很多人遇到过这个错误。只需谷歌它并找到解决方案:)。

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 2019-03-07
      • 2018-12-26
      • 2020-10-07
      • 2019-08-08
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多