यह समस्या आमतौर पर तब होती है जब py2 से py3 पर स्विच किया जाता है। Py2 plaintext
में एक स्ट्रिंग और बाइट सरणी प्रकार दोनों है । Py3 में plaintext
केवल एक है स्ट्रिंग , और विधि outfile.write()
वास्तव में एक लेता है बाइट सरणी जब outfile
द्विआधारी मोड में खोला गया है, इसलिए एक अपवाद उठाया है। plaintext.encode('utf-8')
समस्या को ठीक करने के लिए इनपुट बदलें । आगे पढ़िए अगर ये आपको परेशान करता है
Py2 में, file.write के लिए घोषणा ने ऐसा प्रतीत किया जैसे आप एक स्ट्रिंग में पास हुए हैं file.write(str)
:। वास्तव में आप एक बाइट सरणी में गुजर रहे थे, आपको इस तरह से घोषणा को पढ़ना चाहिए था file.write(bytes)
:। आप इसे इस समस्या को सरल है की तरह पढ़ते हैं, file.write(bytes)
जरूरत है एक बाइट प्राप्त करने के लिए प्रकार और py3 में बाइट्स एक से बाहर str आप इसे परिवर्तित:
py3>> outfile.write(plaintext.encode('utf-8'))
क्यों py2 डॉक्स घोषित किया file.write
एक स्ट्रिंग लिया? अच्छी तरह से py2 में घोषणा भेद से कोई फर्क नहीं पड़ा क्योंकि:
py2>> str==bytes #str and bytes aliased a single hybrid class in py2
True
Str-बाइट py2 के वर्ग तरीकों / कंस्ट्रक्टर्स है कि यह कुछ मायनों में एक स्ट्रिंग वर्ग और अन्य लोगों में एक बाइट सरणी वर्ग की तरह व्यवहार करना है। सुविधाजनक file.write
नहीं है ?:
py2>> plaintext='my string literal'
py2>> type(plaintext)
str #is it a string or is it a byte array? it's both!
py2>> outfile.write(plaintext) #can use plaintext as a byte array
Py3 ने इस अच्छे सिस्टम को क्यों तोड़ा? अच्छी तरह से क्योंकि py2 बुनियादी स्ट्रिंग कार्यों में दुनिया के बाकी हिस्सों के लिए काम नहीं किया। गैर-ASCII वर्ण के साथ किसी शब्द की लंबाई को मापें?
py2>> len('¡no') #length of string=3, length of UTF-8 byte array=4, since with variable len encoding the non-ASCII chars = 2-6 bytes
4 #always gives bytes.len not str.len
यह सब समय आपने सोचा था कि आप पी 2 में एक स्ट्रिंग की लेन के लिए पूछ रहे थे , आपको एन्कोडिंग से बाइट सरणी की लंबाई मिल रही थी। यह अस्पष्टता दोहरे कर्तव्य वर्गों के साथ मूलभूत समस्या है। आप किसी भी विधि कॉल के किस संस्करण को लागू करते हैं?
अच्छी खबर यह है कि py3 इस समस्या को ठीक करता है। यह str और बाइट्स वर्गों को नापसंद करता है । Str वर्ग है स्ट्रिंग की तरह तरीकों, अलग बाइट्स वर्ग बाइट सरणी तरीकों है:
py3>> len('¡ok') #string
3
py3>> len('¡ok'.encode('utf-8')) #bytes
4
उम्मीद है कि यह जानने से समस्या को सुलझाने में मदद मिलती है, और प्रवासन दर्द को सहन करना थोड़ा आसान हो जाता है।