2013-06-12 25 views
0

這可能是非常簡單的事情,我知道有很多像我這樣的類似案例,但我無法弄清楚如何解決這個問題。我還是比較新的Python。無法在Python中正確編碼JSON文件

問題

我有以下內容的JSON文件(expr.json):

{ 
    "vowel": "a|e|i|o|u|y|ä|ö", 
    "consonant": "b|c|d|f|g|h|j|k|l|m|n|p|r|s|š|t|v|z|ž" 
} 

我想壽讀取該文件,並分析它的使用Python的JSON模塊的內容。我想稍後使用re.compile編譯密鑰的值。這裏是我的代碼(main.py):

#!/usr/bin/python 
# vim: set fileencoding=utf-8 : 

import json 

myfile = open('expr.json') 
data = myfile.read() 
myfile.close() 

json_data = json.loads(data) 
print json_data # {u'consonant': u'b|c|d|f|g|h|j|k|l|m|n|p|r|s|\u0161|t|v|z|\u017e', u'vowel': u'a|e|i|o|u|y|\xe4|\xf6'} 

但是,當我嘗試acceess '元音':

json_data['vowel'] 

我收到以下錯誤信息:

Traceback (most recent call last):

File "/path to main.py", line 11, in

print json_data['vowel']

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 12: ordinal > not in range(128) [Finished in 0.1s with exit code 1]

的UnicodeDecodeError :'ascii'編解碼器無法解碼位置25中的字節0xc3:序號不在範圍內(128)

什麼有我試圖

1)嘗試使用data.encode調用json.loads之前編碼串( 'UTF-8') =>還是相同的錯誤消息

2)逃逸錯誤產生使用他們的轉義版本的字符(ä,ö):(\ u00E4,\ u00F6)=>沒有錯誤,但是當我嘗試使用re.compile編譯它們時,它們無法按預期工作(與轉義字符不匹配)

3),使用雙反斜槓\\ =>還是相同的錯誤消息

轉義字符

我在Mac OSX上使用Python版本2.7.2。我的編輯器是Sublime Text 2,我從編輯器的內置控制檯讀取了值。我來自JavaScript的世界,我沒有同樣的問題。

非常感謝,如果我的問題重複,我非常抱歉!

編輯1:增加了Sublime Text控制檯給出的完整錯誤信息。

+0

這不是完整的代碼,讓你的錯誤。 –

+0

Sublime Text是否有某種你用來運行代碼的內置Python解釋器? – Aya

+0

感謝大家幫助我解決這個問題! :)這個解決方案與我最初的想法非常不同。 –

回答

1

如果您嘗試

print repr(json_data['vowel']) 

你會看到值顯示,即問題不在於JSON,但打印的Unicode。嘗試

print u"\xe4" 

應該產生相同的UnicodeEncodeError。配置您的編輯器以允許從Python打印Unicode。您可以嘗試爲編輯器的內置控制檯(或其使用的編碼)設置PYTHONIOENCODING=utf-8環境變量。

無關你的問題,你可以稍微地簡化UTF-8編碼的JSON文件的加載:

import json 

with open("expr.json", "rb") as file: 
    json_data = json.load(file) 
+0

呃,你是對的!運行打印'u「\ xe4」'確實會引發UnicodeEncodeError。所以問題不在於我的代碼,而在於編輯器?它一直在讓我瘋狂!謝謝! –

+0

我試着在終端上運行'print u「\ xe4」',它給了我準確的結果!謝謝你解決這個問題給我!要花我很多時間才能自己解決它,拼命地嘗試狐狸我的代碼= P –