2017-06-18 49 views
1

我必須匹配來自CSV和JSON文件的數據。 除了從文件中讀取「科特迪瓦」時,所有內容都可以使用。我必須根據國名匹配數據。如何從JSON文件中讀取「Côted'Ivoire」python

從CSV閱讀下面的代碼時:

dataframe = pandas.read_csv(filename) 

我得到 「科特迪瓦」

"CIV","Côte d'Ivoire",1 ----line in csv file 

但與下面的代碼從JSON文件讀取時:

json_data = json.loads(open(filename).read()) 

我得到「科特迪瓦」

{ 
    "label": "CIV", 
    "display": "Côte d'Ivoire", 
    "display_sequence": 1 
} ---- block in json file 

所以,現在當我比較他們做匹配字符串,我喜歡一個國家的數據。我用記事本++打開了csv和json文件,看到兩個文件都包含「Côted'Ivoire」。

我明白,這可能是一個編碼的問題,所以我想知道如何讀的JSON文件,以便該字符串正確讀取。

回答

3

從服裝的種類來看,你看到的是一個UTF-8文件,而你係統上的默認編碼是Latin1或windows-1252(最可能是後者,因爲大多數UNIX系統默認爲UTF-8和windows-1252在Windows上比非常相似的Latin1更受歡迎。現在

,正在發生的事情是,默認情況下,當你在文本模式下的Python 3打開文件「有益」嘗試將其與本地編碼,不管這恰好是解碼。

我們在這裏想要什麼,取而代之的,是閱讀原始字節,並使用正確的編碼解碼。因此,我們必須以二進制方式打開文件,採取byte對象read現在返回並decode它與正確的編碼,從而獲得一個str,我們可以使用。

json_data = json.loads(open(filename, "rb").read().decode('utf-8')) 

所以,這主要是爲了瞭解涉及從字節unicode字符串去的步驟;幸運的是,Python 3提供了一種更簡單的方式:在文本模式下,您可以指定要使用的編碼,而不是默認的編碼。所以,我們可以回到一個簡單的

json_data = json.loads(open(filename, encoding='utf-8').read()) 

這也比上面的代碼片段更有效,因爲在閱讀,而不必整個大字符串轉換,轉換執行。

棘手位要記住這裏是read返回,當你以二進制方式打開該文件一個byte對象(所以你必須decode它手動,如果你想將其解釋爲文本數據的str)或以文本模式打開時已解碼的對象str。在這最後一種情況下,無論你的文件是在Python認爲默認編碼是什麼,或者你必須明確指定正確的編碼,否則你會閱讀垃圾。

+0

謝謝你,這不是那麼頻繁地看到一個公認的答案試圖下臺:-) –

+0

毫米如果Latin1的是默認的編碼最有可能OP是在Windows上。 –

+0

是的,但同樣,您正在爲本地問題應用全局解決方案。不幸的是,編碼文件是個案事件。國際海事組織應該沒有違約。要麼你確定該特定文件的編碼(並且實際上*需要*將這些內容轉換爲unicode字符串),或者只需以二進制模式打開文件並只讀* bytes *即可。 –