我有一些使用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的东西?
答案 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文本的人的生活。