簡體   English   中英

Python 3 沒有正確讀取 JSON 文件

[英]Python 3 not reading a JSON file right

我有一些由 powershell 使用ConvertTo-Json命令創建的 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'

出於某種原因,所有字符都是轉義字節字符,並且在開始時有奇怪的ÿ (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的東西?

您的文件開頭似乎有一個BOM 您可以在十六進制編輯器或良好的文本編輯器中對其進行驗證(Notepad++ 會顯示 BOM 是否存在)。

正如 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 對文本文件進行編碼。

如果你想加載帶有 Unicode BOM 標頭的文本文件,就像你的一樣,你應該更好地使用 codecs.open 函數而不是 open 因為默認的 open 無法解釋 BOM。

或者你可以看看tendo.unicode——我寫的一個小庫,可以改善不習慣Unicode文本的人的生活。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM