2013-08-27 8 views
9

से अजगर में वर्ण '\ u2019' मुद्रित नहीं कर सकते एक परियोजना के रूप में मुझे अजगर सीखने में मदद करने, मैं (उदाहरण के www.reddit.com/all/ के लिए json डेटा का उपयोग कर रेडिट के अध्यक्ष एवं प्रबंध निदेशक दर्शक बना रहा हूं .json)। जब कुछ पोस्ट दिखाई देते हैं और मैं उन्हें मुद्रित करने का प्रयास करता हूं (मुझे लगता है कि यह त्रुटि उत्पन्न कर रहा है), मुझे यह त्रुटि मिलती है:JSON ऑब्जेक्ट

ट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "सी: \ उपयोगकर्ता \ nsaba \ डेस्कटॉप \ 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: 'charmap' कोडेक स्थिति 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, या आपके कोड में किसी और चीज़ के साथ करने के लिए कुछ भी नहीं है। बस 'प्रिंट (' \ u2019 ')' आज़माएं और देखें कि आपको एक ही त्रुटि मिलती है या नहीं। यदि ऐसा है, तो समस्या यह है कि आपका टर्मिनल ("डॉस बॉक्स") यूनिकोड आउटपुट को ठीक से करने के लिए सेट नहीं है, और यही आपको ठीक करने की आवश्यकता है। – abarnert

+0

हाँ आप सही हैं। अतिरिक्त डेटा का कारण यह है कि मैंने अपनी जानकारी के बारे में प्रश्न पूछना सीखा है, और जो कुछ भी मुझे लगता है उसके बारे में नहीं। –

+1

लेकिन आपको न्यूनतम समस्या का पोस्ट करना चाहिए जो आपकी समस्या का प्रदर्शन करता है। यही एक [एसएससीसीई] (http://sscce.org) है। यदि 'प्रिंट (' \ u2019 ')' इसे प्रदर्शित करने के लिए पर्याप्त है, तो कोई और जटिल उदाहरण सिर्फ जंगली हंस के पीछा करने वाले लोगों का नेतृत्व करने जा रहा है। यदि आप चिंतित हैं तो लोग पूछ सकते हैं कि "आप उस चरित्र को क्यों प्रिंट करना चाहते हैं?", तो आप उस संदर्भ को जोड़ सकते हैं जो इसे समझाता है ... लेकिन फिर भी, वास्तविक समस्या का कारण बनता है। – abarnert

उत्तर

18

यह आप समस्या कोड आप दिखाया है के साथ कोई संबंध नहीं है, और एक पंक्ति में reproduced किया जा सकता है कि लगभग निश्चित है:

print(u'\2019') 

अपने टर्मिनल के चरित्र सेट U + 2019 (संभाल नहीं कर सकते या यदि पाइथन आपके टर्मिनल का उपयोग करने वाले चरित्र के बारे में उलझन में है), तो इसे प्रिंट करने का कोई तरीका नहीं है। इससे कोई फर्क नहीं पड़ता कि यह जेएसओएन या कहीं और से आता है।

विंडोज टर्मिनल (उर्फ "डॉस शीघ्र" या "cmd खिड़की") आम तौर पर एक चरित्र cp1252 की तरह सेट किया है कि केवल के बारे में जानता 110000 पात्रों में से 256 के लिए कॉन्फ़िगर किया गया है, और एक बड़ा परिवर्तन के बिना कुछ भी अजगर इस बारे में कुछ नहीं कर सकता है भाषा कार्यान्वयन के लिए। *

विवरण, समाधान और अधिक जानकारी के लिए लिंक के लिए अजगर विकी पर PrintFails देखें। SO पर इस समस्या के कुछ सौ डुप्लिकेट भी हैं (हालांकि उनमें से कई पायथन 2.x के लिए विशिष्ट होंगे, इसका उल्लेख किए बिना)।


* विंडोज, टर्मिनल के लिए UTF-16 के मुद्रण के लिए एपीआई की एक पूरी अलग सेट है तो अजगर का पता लगा सकता है कि stdout एक Windows टर्मिनल है, और यदि ऐसा है तो UTF-16 के लिए सांकेतिक शब्दों में बदलना और इसके बजाय विशेष API का उपयोग टर्मिनल के वर्णमाला में एन्कोडिंग और मानक का उपयोग करना। लेकिन यह विभिन्न समस्याओं का एक गुच्छा उठाता है (उदाहरण के लिए, stdout को सिंक से बाहर होने के प्रिंटिंग के विभिन्न तरीके)। इन परिवर्तन करने के बारे में चर्चा हुई है, लेकिन यहां तक ​​कि अगर हर कोई इस बात से सहमत थे और पैच कल लिखा गया था, यह अभी भी आप जब तक आप इसे रख दिया जाता है अजगर की जो कुछ भी भविष्य संस्करण में नवीनीकृत मदद नहीं होता ...

+0

डुप्ली के लिए खेद है। मैं आपके द्वारा प्रदान किए गए संसाधनों के चारों ओर देखूंगा। –

+3

@ एन-सबा: ठीक है, यह जानना मुश्किल है कि यह एक डुप्लिक है, क्योंकि यह वास्तव में स्पष्ट नहीं है कि आपको तब तक क्या खोजना चाहिए जब तक आप कम से कम आधा जवाब नहीं जानते ... – abarnert

+0

@ एन-सबा, मुझे पता है कि यह एक पुराना है थ्रेड, लेकिन आपको इसे उत्तर के रूप में चिह्नित करना चाहिए यदि उसने आपके प्रश्न का उत्तर दिया (यह मेरा था) – ivan7707

0

मैं निष्क्रिय सेट (पायथन शेल) और खिड़की का सीएमडी डिफ़ॉल्ट फ़ॉन्ट लुसीडा कंसोल (एक यूटीएफ -8 समर्थित फ़ॉन्ट) और इन प्रकार की त्रुटियों से दूर चला गया; और तुम अब देखना बक्से [] [] [] [] [] [] [] []

:)

0

@ एन सबा, क्या स्ट्रिंग है जो त्रुटि होती है फेंक दिया जा सकती है? अपने परीक्षण मामले में, इस अजगर 2.7.3 में एक संस्करण-विशिष्ट बग लग रहा है।

फ़ीड मैं पार्स करने गया था, "शीर्षक" फ़ील्ड में निम्नलिखित मान था:

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

मैं उम्मीद सही एकल उद्धरण चार मिलता है जब मैं इन दोनों में से किसी को फोन, अजगर में 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 में, मैं त्रुटि मिलती है, जब तक कि मैं मूल्य है कि मैं KeyName द्वारा खींचा सांकेतिक शब्दों में बदलना।

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 कमांड प्रिंट ('\ u2019') प्रिंट "9"। मुझे लगता है कि इच्छित कोड प्रिंट किया गया था (u '\ u2019')।

+0

'यू' पाइथन 3 के लिए आवश्यक नहीं है, क्योंकि यह यूनिकोड पर डिफ़ॉल्ट है। – leewz

+0

मुझे यह त्रुटि 2.7.6 में मिलती है – user1167442

0

पायथन 2.7.14 के विन इंस्टॉलेशन पर pd.DataFrame.to_csv() के माध्यम से एक .cav फ़ाइल में एक API JSON आउटपुट लिखने का प्रयास करते समय मुझे एक ही त्रुटि मिली।

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') 

स्पष्ट करने के लिए, इस यकीन है कि टर्मिनल उत्पादन यूनिकोड सही ढंग से स्वीकार करता है कर रही है।

संबंधित मुद्दे