2013-08-27 63 views
9

打印字符「\ u2019」作爲一個項目來幫助我學習Python,我使用JSON數據(例如www.reddit.com/all/製作書籤交易的CMD觀衆以.json)。當某些帖子出現並嘗試打印它們時(我認爲這是導致錯誤的原因),我得到此錯誤:無法在Python從JSON對象

回溯(最近呼叫最後一次): 文件「C:\ Users \ nsaba \ Desktop \ reddit_viewer.py」,線路33,在 打印( 「%d。(%d)%S \ n」 個%(I + 1,OBJ [ '數據'] [ '得分'],OBJ [ '數據'] [ '標題']))

文件 「C:\ Python33 \ lib中\編碼\ cp437.py」,第19行,在編碼 返回codecs.charmap_encode(輸入,self.errors,encoding_map)[0] UnicodeEncodeError:「字符表」編解碼器不能在 位置32編碼字符「\ u2019」:字符映射到

這裏是我處理的數據:

request = urllib.request.urlopen(url) 
content = request.read().decode('utf-8') 
jstuff = json.loads(content) 

我用它來打印數據在上面的錯誤中列出的線路:

print ("%d. (%d) %s\n" % (i+1, obj['data']['score'], obj['data']['title'])) 

任何人都可以提出,我可能會去錯了嗎?

+0

這個問題幾乎肯定與JSON或代碼中的其他內容無關。試試'print('\ u2019')'看看你是否得到相同的錯誤。如果是這樣,問題是您的終端(「DOS盒」)沒有設置爲正確輸出Unicode輸出,這就是您需要修復的問題。 – abarnert

+0

是的,你是對的。額外數據的原因是因爲我已經學會根據我擁有的信息提出問題,而不是關於我認爲可能的問題。 –

+1

但是,您應該發佈演示您的問題的最小完整示例。這就是[SSCCE](http://sscce.org)的全部內容。如果'print('\ u2019')'足以證明這一點,那麼更復雜的例子就是引導人們追逐雁蕩。如果你擔心人們可能會問「你爲什麼要打印那個角色?」,那麼你可以添加解釋它的上下文......但仍然會導致實際問題。 – abarnert

回答

18

幾乎可以肯定,你的問題無關,與你所顯示的代碼,並且可以在一個行被複制:

print(u'\2019') 

如果終端的字符集不能處理U + 2019(或者如果Python對您的終端使用的字符集感到困惑),則無法將其打印出來。無論它來自JSON還是其他任何地方都無關緊要。

Windows終端(又名「DOS提示符」或「cmd窗口」)通常配置爲像cp1252這樣的字符集,它只知道110000個字符中的256個字符,並且沒有任何重大變化,Python就無法做到這一點在語言實現。*

的細節,解決方法和更多信息鏈接查看PrintFails對Python的維基。 SO上也有幾百個這樣的問題(儘管其中很多都是針對Python 2.x的,沒有提到它)。


* Windows有用於打印UTF-16到終端整組獨立的API,所以Python可以檢測到stdout是一個Windows終端,如果是編碼爲UTF-16,並使用特殊的API,而不是編碼到終端的字符集並使用標準字符集。但是這會引發一系列不同的問題(例如,打印到stdout的不同步方式不同)。有過討論,關於做出這些改變,但即使大家都同意和貼片寫明天,它仍然不會幫助你,直到你升級到任何未來版本的Python它添加到...

+0

對不起。我會環顧你提供的資源。 –

+3

@ N-Saba:好吧,很難知道這是一個dup,因爲直到你已經知道答案的至少一半之前,你應該搜索什麼不是很清楚...... – abarnert

+0

@ N-Saba,我知道這是一個老的線程,但是如果它確實回答了你的問題(這是我的) – ivan7707

0

我設置IDLE( Python Shell)以及Window的CMD默認字體Lucida Console(UTF-8支持的字體),並且這些類型的錯誤消失了;你再也看不到箱子[] [] [] [] [] [] [] []

:)

0

@ N-薩巴,什麼是拋出導致錯誤的字符串? 在我的測試情況下,這看起來是在Python 2.7.3 一個特定版本的bug。

在進我的解析,「標題」字段有以下值:

u'title': u'Intel\u2019s Sharp-Eyed Social Scientist' 

我得到預期的正確的單引號字符時,我稱其中任意一個,在Python 2.7.6

python -c "print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title']" 
Intel’s Sharp-Eyed Social Scientist 

2.7.3,我得到的錯誤,除非我編碼,我拉着鍵名的值。

print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title'] 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 5: ordinal not in range(128) 
print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title'].encode('utf-8', 'replace') 
Intel’s Sharp-Eyed Social Scientist 

fwiw,@abamert命令print('\ u2019')打印「9」。我認爲打算的代碼是print(u'\ u2019')。

+0

Python 3不需要'u',因爲它默認爲Unicode。 – leewz

+0

我在2.7.6中得到這個錯誤 – user1167442

0

當嘗試通過Python 2.7.14的Win安裝上的pd.DataFrame.to_csv()將API JSON輸出寫入.cav文件時,我遇到了類似的錯誤。

指定編碼爲utf-8固定我的過程:

pd.DataFrame.to_csv(filename, encoding='utf-8') 
0

對於任何人在MacOS上遇到此,@ abarnert的答案是正確的,我能夠把這個在有問題的源文件的頂部進行修復: -

# magic to make everything work in Unicode 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

爲了澄清,這是確保終端輸出接受正確的Unicode。