Yazar | veelion
Sorumlu Editör | Hu Weiwei
Python2'de iki tür dize vardır: str ve Unicode ve Python3'te iki tür dize vardır: str ve Bytes. Python2'nin str, Python3'ün Bytes'ına eşdeğerdir ve Unicode, Python3'ün str'ye eşdeğerdir.
Python2'deki str ve Unicode karıştırılabilir ve ikisi de İngilizce harf olduğunda str ve unicode arasında hiçbir fark yoktur.
Python3, metni (str) ve ikili verileri (Bayt) kesin olarak ayırır. Metin her zaman Unicode, str türü kullanılır ve ikili veriler Bayt türü ile gösterilir. Bu tür katı kısıtlamalar, bize bunların nasıl kullanılacağına dair net bir anlayış da verir. Harika.
Python2 ve Python3 arasındaki fark
Aşağıdaki kod aracılığıyla, aşağıdaki Python2 ve Python3 dize karıştırma durumunu tanıyoruz:
# Python2 : Giriş: 'a' == u'a'Çıkış: Doğru In: 'a' in u'a'Out: Doğru İçinde: 'programlama' == u'programming '/ usr / local / bin / ipython: 1: Unicode Uyarı: Unicode eşit karşılaştırması, her iki bağımsız değişkeni de Unicode'a dönüştürmede başarısız oldu - onları eşit değil olarak yorumladı #! / Usr / bin / pythonOut: False In: u'Programlamada 'Programlama' ---------------------------------------- ----------------------------------- UnicodeDecodeError Traceback (en son çağrı son) < ipython-input-4-7b677a923254 > içinde < modül > () ---- > 1 u 'Programlamada' 'Programlama' UnicodeDecodeError: 'ascii' codec bileşeni 0 konumundaki bayt 0xe7'nin kodunu çözemiyor: ordinal aralıkta değil (128) # Python3 : İçinde: 'a' == b'a'Out: Yanlış İçinde: 'a' in b'a '---------------------------------------- ----------------------------------- TypeError Traceback (en son çağrı son) < ipython-input-10-ca907fd8856f > içinde < modül > () ---- > 1'a 'in b'a' TypeError: 'str' değil, bayt benzeri bir nesne gereklidirYukarıdaki koddan da görebileceğiniz gibi, Python2'de str ve Unicode arasında her ikisi de ASCII kodu olduğunda hiçbir fark yoktur, çünkü Unicode'un ASCII alanının değeri str'nin ASCII'si ile aynıdır ve ASCII olmayan alanlar için (Çince gibi) ikisi değildir Aynısı.
Python2'nin bir Unicode Kod Çözme Hatası istisnası attığını görebilirsiniz.Bu aynı zamanda birçok insanın metin işlerken karşılaştığı bir hata olduğuna inanıyorum; "programlama" uzunluğu str türünde 6 ve Unicode'da 2'dir. Farklı karakterlerin farklı performansı Python2 str ve Unicode'un kafa karıştırıcı görünmesine neden olur.
Python3'te, str ve Bytes kesinlikle ayırt edilir.Farklı türler arasındaki işlemler, Tip Hatası istisnaları atar.
Yukarıdaki örnek, Python2 ve Python3'teki dizeler arasındaki farkı gösterir ve aşağıdaki esas olarak Python3'teki dizeler hakkında konuşur.
Str ve baytlar arasında dönüşüm
Bir resim bin kelime değerinde bir olup:
Str ve baytlar arasında dönüşüm
str.encode ("kodlama") - > bayt
bytes.decode ("kodlama") - > str
Kodlama, belirli kodlama kuralının adını ifade eder. Çince için bu değerler şu olabilir: "utf-8", "gb2312", "gbk", "big5" vb.
Yukarıdaki şekildeki str dikdörtgenin Bytes dikdörtgeninden daha kısa olduğunu fark ettiniz mi bilmiyorum, bu aynı içerik anlamına gelir. Str uzunluğu Byte uzunluğundan daha az veya ona eşit olmalıdır. Nedeni düşünebilirsiniz (Unicode ve UTF-8 kodlama kurallarına bakın) .
Str ve Bytes arasındaki dönüşümü anlamak için belirli koda bir göz atalım:
İçinde: a = 'T-shirt' İçinde: a Çıkan: 'T-shirt' Giriş: len (a) Çıkış: 2In: b = a.encode ('utf8') İçinde: b Dışarı: b'T \ xe6 \ x81 \ xa4'In: a == b Çıkış: FalseIn: c = a.encode ('gbk') İçinde: c Çıkış: b'T \ xd0 \ xf4'In: b == c Çıkış: FalseIn: a == c Çıkan: FalseYukarıdaki str ve Bytes arasındaki dönüşüm, metin içeriği içindir. Başka bir ikili içerikse (resimler gibi), Baytların kodu str olarak çözülemez. Aşağıdaki kodun istisnasına bakın:
İçinde: img = open ('str-bytes.jpg', 'rb'). Oku () In: type (img) Çıkış: bayt In: img.decode ('utf8') -------------------------------------------------- ------------------------- UnicodeDecodeError Traceback (en son çağrı sonuncu) < ipython-input-31-c9e28f45be95 > içinde < modül > () --- > 1 img.decode ('utf8') UnicodeDecodeError: 'utf-8' codec'i 0 konumunda 0xff baytının kodunu çözemiyor: geçersiz başlangıç baytıÇünkü resimdeki ikili veriler, metin verilerinin UTF-8 kodlama kurallarına uymuyor.
Yukarıdaki resim verilerini aldığımızda, dosyayı okumak için open () kullanırız. Dosya iki formatta depolanır, metin ve ikili. Dosyaları okurken ve yazarken de açık kodlar vardır:
In: open ('z.txt', 'w'). Write ('T-shirt') Çıkış: 2In: open ('z.txt', 'w'). Write (img) -------------------------------------------------- ------------------------- TypeError Traceback (en son çağrı son) < ipython-input-33-4a88980b3a54 > içinde < modül > () ---- > 1 açık ('z.txt', 'w'). Yazma (img) TypeError: write () bağımsız değişkeni bayt değil, str olmalıdır İçinde: açık ('z.txt', 'wb'). Yazma (img) Çıkan: 12147İkili verileri okurken ve yazarken (resimler gibi), 'rb' parametresini, b kodu İkili (ikili) ekleyin. Metin verilerini okurken ve yazarken, genellikle add'b ', open () Byte'ı otomatik olarak str'ye dönüştürür.
sonuç olarak
Python3'teki str, bellekteki metin verileri için, Byte ise ikili veriler için kullanılır.
str Byte olarak kodlanabilir, ancak Bytes mutlaka str olarak kodlanamaz. Aslında, Bytes.decode ('latin1') str olarak adlandırılabilir, bu da kod çözme tarafından kullanılan kodlamanın kod çözme () işleminin başarısını veya başarısızlığını belirlediği anlamına gelir. Benzer şekilde, kod çözme için GBK kullanan UTF-8 kodlu Bayt dizeleri de hata yapar .
Baytlar genellikle ağdan okunan verilerden, ikili dosyalardan okunan verilerden (resimler vb.) Ve ikili modda okunan metin dosyalarından (.txt, .html, .py, .cpp, vb.) Gelir.
Yazar: veelion, geliştirme konusunda uzun yıllara dayanan deneyime sahip, ağırlıklı olarak Python, C ++ dilini kullanıyor, web tarayıcıları, arama motorları, doğal dil işleme alanında araştırma ve geliştirme yapıyor.
Feragatname: Bu makale yazar tarafından sunulmuştur ve telif hakkı karşı tarafa aittir.
2018 AI Geliştirici Konferansı
AI Mühendisleri için Gerekli Konferans
2018 AI Geliştirici Konferansı, Çinli ve Amerikalı yapay zeka teknolojisi uzmanları tarafından ortaklaşa oluşturulan AI teknolojisi ve endüstrisinin yıllık bir etkinliğidir! Sadece teknoloji hakkında konuşuyoruz ve boş konuşmaları reddediyoruz!
İşte 10 teknik forum: Bilgisayarla görme, veri analizi, makine öğrenimi, bilgi grafiği, akıllı finans, akıllı sürüş, ses teknolojisi, akıllı tıbbi bakım, makine öğrenimi araçları, doğal dil işleme.
Ayrıca 15'ten fazla Silikon Vadisi güçlü öğretim görevlisi, 80'den fazla yapay zeka lider kurumsal teknoloji temel figürü, 100'den fazla teknik kitle medyası ve 1500'den fazla yapay zeka profesyonel geliştiricisi bulunmaktadır.
Hızlı bir şekilde konferans hakkında daha fazla bilgi almak ve en düşük indirimli biletleri almak için aşağıdaki "poster" e tıklayın!
Tıklamak "Orijinali okuyun" Ayrıca hemen kaydolabilirsiniz.