2013-05-14 11 views
19

निर्दिष्ट करने के लिए कैसे, मैं जब मानक इनपुट से UTF-8 पाठ पढ़ने इस समस्या में पड़। अजगर 2 में, यह ठीक काम करता है:अजगर 3: अजगर 2 से कोड पोर्टिंग जबकि अजगर से 3 stdin एन्कोडिंग

for line in sys.stdin: 
    ... 

लेकिन अजगर 3 उम्मीद से ASCII sys.stdin, और अगर वहाँ इनपुट में गैर- ASCII वर्ण हैं, मैं त्रुटि मिलती है:

UnicodeDecodeError: 'ascii' codec can't decode byte .. in position ..: ordinal not in range(128)

एक नियमित रूप से फ़ाइल के लिए, मैं एन्कोडिंग जब फ़ाइल खोलने में निर्दिष्ट करना होगा:

with open('filename', 'r', encoding='utf-8') as file: 
    for line in file: 
     ... 

लेकिन यह कैसे मैं मानक इनपुट के लिए एन्कोडिंग निर्दिष्ट कर सकते हैं? अन्य एसओ पदों ने

input_stream = codecs.getreader('utf-8')(sys.stdin) 
for line in input_stream: 
    ... 

हालांकि, यह पायथन 3 में काम नहीं करता है। मुझे अभी भी एक ही त्रुटि संदेश मिलता है। मैं उबंटू 12.04.2 का उपयोग कर रहा हूं और मेरा लोकेल en_US.UTF-8 पर सेट है।

उत्तर

35

अजगर 3 sys.stdin से ASCII उम्मीद नहीं करता है। यह टेक्स्ट मोड में stdin खुल जाएगा और एक एन्कोडिंग अनुमान लगाएगा कि एन्कोडिंग का उपयोग किस प्रकार किया जाता है। यह अनुमान ASCII पर आ सकता है, लेकिन यह एक दिया गया नहीं है। कोडेक का चयन कैसे किया जाता है, इस पर sys.stdin documentation देखें।

टेक्स्ट मोड में खोले गए अन्य फ़ाइल ऑब्जेक्ट्स की तरह, sys.stdin ऑब्जेक्ट io.TextIOBase base class से प्राप्त होता है; यह एक .buffer विशेषता अंतर्निहित बफ़र आईओ उदाहरण (जो बारी में एक .raw विशेषता है) की ओर इशारा करते हैं।

लपेटें एक नया io.TextIOWrapper() instance में sys.stdin.buffer विशेषता एक अलग एन्कोडिंग निर्दिष्ट करने के लिए:

import io 
import sys 

input_stream = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8') 

वैकल्पिक रूप से, वांछित कोडेक के PYTHONIOENCODING environment variable सेट जब अजगर चल रहा है।

+0

धन्यवाद, इस चाल किया! –

+2

python2.6 के लिए निकटतम समतुल्य क्या है? – bukzor

+1

@bukzor: अगला विकल्प: फ़ाइल डिस्क्रिप्टर को सीधे 'io.open() 'के साथ खोलें; '0'' stdin' है: 'io.open (0) '' TextIOWrapper() 'ऑब्जेक्ट देता है। –