पायथन 2 में यूनिकोड स्ट्रिंग्स और बाइटस्ट्रेस हैं। यदि आप बस बायस्ट्रेस का उपयोग करते हैं, तो आप open()
बस ठीक के साथ खोली गई फ़ाइल को पढ़ / लिख सकते हैं । सब के बाद, तार बस बाइट्स हैं।
समस्या तब आती है, जब कहते हैं, आपके पास एक यूनिकोड स्ट्रिंग है और आप निम्न कार्य करते हैं:
>>> example = u'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
तो यहाँ स्पष्ट रूप से आप या तो स्पष्ट रूप से अपने यूनिकोड स्ट्रिंग को utf-8 में एनकोड करते हैं या आप codecs.open
इसे पारदर्शी रूप से आपके लिए करते हैं।
यदि आप केवल कभी-कभी बायस्ट्रेस का उपयोग कर रहे हैं तो कोई समस्या नहीं है:
>>> example = 'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
>>>
यह इस से अधिक शामिल हो जाता है क्योंकि जब आप एक यूनिकोड और बायट्रैस्ट्रिंग स्ट्रिंग को +
ऑपरेटर से मिलाते हैं तो आपको एक यूनीकोड स्ट्रिंग मिलती है। उस एक से काटे जाना आसान है।
इसके अलावा codecs.open
गैर-एएससीआईआई चार्ट के साथ बाइटस्ट्रेस पसंद नहीं किया जा रहा है:
codecs.open('test', 'w', encoding='utf-8').write('Μου αρέσει')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/codecs.py", line 691, in write
return self.writer.write(data)
File "/usr/lib/python2.7/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)
इनपुट / ouput के लिए स्ट्रिंग्स के बारे में सलाह आम तौर पर "यूनिकोड को यथाशीघ्र रूपांतरित करने और देर से संभव के रूप में बाइटस्ट्रेस में वापस होती है"। उपयोग codecs.open
करने से आप बाद को बहुत आसानी से कर सकते हैं।
बस सावधान रहें कि आप इसे यूनिकोड स्ट्रिंग्स दे रहे हैं न कि बाइटस्ट्रेस जो कि गैर-एएससीआईआई अक्षर हो सकते हैं।
codecs.open()
3.x में अप्रचलित है, चूंकिopen()
एकencoding
तर्क प्राप्त होता है।