Python 3 dizelerinde STR ve Bytes arasındaki fark nedir?

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 gereklidir

Yukarı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: False

Yukarı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.

Araba ayrıca parmak izi tanıma + kişilik ön ayarları, Hyundai dördüncü nesil Shengda konfigürasyon pozlama ile donatılmıştır.
önceki
HTTPS, veri aktarımının güvenliğini nasıl sağlar?
Sonraki
Düşük yakıt tüketimi ve güçlü kontrol iyi bir plug-in hibrit otomobillerdir.Bunu nasıl değerlendirirsiniz?
18 yıl önceki QQ hakkında, hatırlıyor musunuz?
King of Glory e-spora da değer mi? LOL lideri size sırrı anlatıyor!
Hangisi daha güvenli, araba mı SUV mu? Verilerle konuşun ve sonunda bir yanıt alın!
Deprem programlanıyor! Bu konu tüm programcıları etkiliyor!
DCT şanzıman gerçek çekiç Changan CS35 PLUS 1.4T versiyonu gerçek araba maruz
WeChat Hindistan'da "öldü"
Kralın ihtişamından LOL'a kadar, sizin için böyle utanç verici bir an yok!
Python, kullanımı kolay ve ucuz bir cep telefonu seçmek için nasıl kullanılır?
China Telecom Care Card paketi çevrimiçidir: aylık kira 1 sent, 1G veri / 100 dakika konuşma dahil
Huawei'in yapay zeka çipleri hakkındaki tüm sorular, cevapları burada var
Uzun süre dikkat ettikten sonra, bu yıl sonunda arabadan bahsediyorum, BAIC New Energy EU5
To Top