Python 3没有正确读取JSON文件

时间:2016-05-27 16:54:37

标签: python json file python-3.x parsing

我有一些使用ConvertTo-Json命令由powershell创建的json文件。 json文件的内容类似于

{
    "Key1":  "Value1",
    "Key2":  "Value2"
}

我运行了python解释器,看看我是否可以读取文件,但是我得到了这个奇怪的输出

>>> f=open('test.json', 'r')
>>> f.read()
'ÿ\xfe{\x00\n\x00\n\x00 \x00 \x00 \x00 \x00"\x00K\x00e\x00y\x001\x00"\x00:\x00 \x00 \x00"\x00V\x00a\x00l\x00u\x00e\x001\x00"\x00,\x00\n\x00\n\x00 \x00 \x00 \x00 \x00"\x00K\x00e\x00y\x002\x00"\x00:\x00 \x00 \x00"\x00V\x00a\x00l\x00u\x00e\x002\x00"\x00\n\x00\n\x00}\x00\n\x00\n\x00'

由于某些原因,所有字符都是转义字节字符,并且begninning上存在奇怪的ÿ(powershell错误?)。

奇怪的是:

>>> f=open('test.json', 'r')
>>> str=f.read()
>>> type(str)
<class 'str'>
>>> json.loads(str)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Rutvik_Choudhary\AppData\Local\Programs\Python\Python35-32\lib\json\__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "C:\Users\Rutvik_Choudhary\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\Rutvik_Choudhary\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

所以输入是一个字符串,但是json模块无法解析它(json.load(f)返回相同的错误)。导致此错误的原因是什么?它是一个python的东西,一个powershell的东西,一个json的东西?

3 个答案:

答案 0 :(得分:3)

您的文件开头似乎有BOM。您可以在十六进制编辑器中或使用优秀的文本编辑器进行验证(Notepad ++显示是否存在BOM)。

答案 1 :(得分:2)

正如jwodder所指出的,PowerShell使用UTF-16LE编码了你的json。要正确地将此数据导入json,您需要使用正确的编码打开该文件。例如

with open("test.json", "r", encoding="utf16") as f:
    json_string = f.read()
my_dict = json.loads(json_string)

您无需告诉Python使用哪种UTF-16变体。这是文本文件的前两个字节的目的。它被称为字节顺序标记(BOM)。它允许程序知道是否已使用UTF-16LE或UTF-16BE对文本文件进行编码。

答案 2 :(得分:1)

如果你想加载带有Unicode BOM头的文本文件,就像你的那样,最好使用codecs.open函数而不是open,因为默认open不能解释BOM。

或者您可以查看tendo.unicode - 我写的一个小型库,可以改善那些不习惯使用Unicode文本的人的生活。