2017-04-12 56 views
1

我想使用附加的Python代碼(Python V3.5.1)讀取下面的json數據,但是問題是字符表示形式爲?和? £。 請幫我將正確讀取和寫入數據,並從該文件中的代碼,而不改變文件格式或字符集使用Python讀取和寫入來自Json文件的Unicode字符

JSON數據:

{ 
    "config":[{ 
      "filetype": ".csv", 
      "coldelimiter":"ç", 
      "rowdelimiter":"£" 
    }] 
} 

Python代碼:

import json 
import os 

fileLoc=os.path.join(os.getcwd(),"appconfig.json") 
json_data=open(fileLoc).read() 
print(json_data) 

輸出:

{ 
    "config":[{ 
      "filetype": ".csv", 
      "coldelimiter":"ç", 
      "rowdelimiter":"£" 
    }] 
} 

回答

0

儘量避免隱式編碼和解碼。

當您使用open()來讀取(或寫入)文本文件(如JSON,但與XML不同)時,文件內容將使用某種默認編碼進行解碼。 使用哪種默認編碼取決於您的環境;你可以用locale.getpreferredencoding()看到這個。

因此,讓我們假設appconfig.json被存儲在磁盤上使用UTF-8,但您的語言環境配置爲使用Latin-1的,那麼信ç會被誤解爲序列§。確認:

>>> 'ç'.encode('utf8').decode('latin1') 
'ç' 

如果是這樣的話,那麼它很容易修復:指定編碼上open()

with open(fileLoc, 'r', encoding='utf8') as f: 
    json_data = f.read() 

還有另一種可能(但不太可能)的解釋:也許默認的編碼已經UTF-8,因此從文件讀取數據時會被正確解碼。 然後,print()表達式再次使用UTF-8對數據進行編碼,從而向STDOUT發送與文件內容完全相同的字節序列。 但是,然後,你的終端(或任何你用來執行腳本)曲解輸出爲拉丁-1,使它們顯示爲亂碼。

如果是後者的話,那麼你需要修復的終端配置(接受UTF-8),或重新編碼sys.stdout(與sys.stdout = codecs.getwriter('latin-1')(sys.stdout),但我不建議)。

+0

謝謝@lenz,是的,這正是我做了,現在它的工作。不同的說法,我是Unix環境的新手。我認爲在Win env中構建和測試的源代碼在Unix env中仍然有效,只要使用相同的Python版本。 對於文件路徑或位置我使用os包(如連接(sourceLoc,文件)),希望我的理解沒問題。對於Windows路徑可以是c:\ filelocation,而在Unix中可以是/ var/sp/filelocation/ 任何有關unix上Python的文檔資料都會有所幫助。 – RintG

+0

@RintG我不知道我明白。如果您試圖編寫可跨操作系統移植的代碼,並且使用'os.path.join'來編寫路徑,那麼需要注意一些事情,這當然是一個不錯的選擇。如果你在Unix上有關於Python的更具體的問題,請發佈一個單獨的問題。 – lenz