Bu sorun genellikle py2'den py3'e geçerken ortaya çıkar. Py2'de plaintext
hem bir dize hem de bir bayt dizi türüdür. PY3 olarak plaintext
sadece bir dize ve yöntem outfile.write()
aslında sürer bayt dizisi ne zaman outfile
bir özel duruma neden yüzden ikili modunda açılır. plaintext.encode('utf-8')
Sorunu gidermek için girişi olarak değiştirin . Bu sizi rahatsız ederse okumaya devam edin.
Py2 olarak, file.write için deklarasyon bir dize geçirilen gibi görünüyor yaptı: file.write(str)
. Aslında bir bayt dizide geçiyordu, böyle bildirimi okunurken olmalıydı: file.write(bytes)
. Eğer sorun basittir bunu böyle okursanız file.write(bytes)
bir ihtiyacı bayt olsun türünü ve PY3 içinde bayt dışarı ait str bunu dönüştürmek:
py3>> outfile.write(plaintext.encode('utf-8'))
Py2 belgeleri neden file.write
ip aldığını açıkladı ? Py2'de beyan ayrımı önemli değildi çünkü:
py2>> str==bytes #str and bytes aliased a single hybrid class in py2
True
Str-bayt py2 sınıf yöntemleri / o bazı yönlerden bir dize sınıf ve diğerlerinde bir bayt dizisi sınıf gibi davranmasını sağlayan oluşturucusu yok. Uygun mu 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 neden bu güzel sistemi kırdı? Peki çünkü py2'de temel dize fonksiyonları dünyanın geri kalanı için işe yaramadı. ASCII karakteri olmayan bir kelimenin uzunluğunu ölçmek ister misiniz?
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
Eğer soran sanıyordum Tüm bu zaman len py2 bir dize, kodlanmasını bayt dizinin uzunluğunu elde edildi. Bu belirsizlik, çift görevli sınıfların temel sorunudur. Herhangi bir yöntem çağrısının hangi sürümünü uyguluyorsunuz?
İyi haber, py3'ün bu sorunu çözmesidir. Str ve bytes sınıflarını çözer . Str sınıfı vardır tel benzeri bir yöntem, ayrı bayt sınıfı bayt dizisi yöntem vardır:
py3>> len('¡ok') #string
3
py3>> len('¡ok'.encode('utf-8')) #bytes
4
Umarım bunun bilinmesi meselenin gizemini ortadan kaldırır ve göç ağrısını taşımayı biraz kolaylaştırır.