পাই 2 থেকে পাই 3 এ স্যুইচ করার সময় এই সমস্যাটি সাধারণত দেখা দেয় occurs পাই 2 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'))
পিআই 2 ডক্স ঘোষিত কেন file.write
স্ট্রিং নিয়েছে? ভাল py2 এ ঘোষণাপত্রের পার্থক্য কোন বিষয় নয় কারণ:
py2>> str==bytes #str and bytes aliased a single hybrid class in py2
True
পাই 2 এর স্ট্র-বাইটস ক্লাসে এমন পদ্ধতি / কনস্ট্রাক্টর রয়েছে যা এটি কিছু উপায়ে স্ট্রিং ক্লাসের মতো আচরণ করে এবং অন্যগুলিতে বাইট অ্যারে ক্লাস করে। 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
পাই 3 কেন এই দুর্দান্ত সিস্টেমটি ভেঙে দিয়েছে? ওয়েল কারণ পাই 2 ইন বেসিক স্ট্রিং ফাংশনগুলি সারা বিশ্বে কাজ করে না। অ-এসকিআইআই অক্ষর দিয়ে কোনও শব্দের দৈর্ঘ্য পরিমাপ করবেন?
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 তে স্ট্রিংয়ের লেন জিজ্ঞাসা করছেন , আপনি এনকোডিং থেকে বাইট অ্যারের দৈর্ঘ্য পাচ্ছেন। দ্ব্যর্থতা ক্লাসগুলির সাথে সেই অস্পষ্টতাই মূল সমস্যা। আপনি কোন পদ্ধতি কলের কোন সংস্করণটি প্রয়োগ করেন?
তারপরে সুসংবাদটি হ'ল পাই 3 এই সমস্যাটি সমাধান করে। এটা তোলে disentangles Str এবং বাইট ক্লাস। Str বর্গ হয়েছে স্ট্রিং মত পদ্ধতি, পৃথক বাইট বর্গ বাইট অ্যারের পদ্ধতি রয়েছে:
py3>> len('¡ok') #string
3
py3>> len('¡ok'.encode('utf-8')) #bytes
4
আশা করি এটি জানার ফলে বিষয়টি ডি-মাইটিসিভ করতে সহায়তা করে এবং মাইগ্রেশন ব্যথা সহ্য করতে কিছুটা সহজ করে তোলে।