Python 3 ile birlikte bytes türü ikili verileri saklamak ve işlemek için temel hale geldi ve str'den ayrıldı. Python 2'de str'ler hem metin hem de baytları içerebiliyordu, bu da farklı kodlamalarda veri işlenmesi sırasında sık hatalara neden oluyordu.
Günlük programlamada, genellikle metin bilgisi dışında veri iletimi ve saklama görevleriyle karşılaşıyoruz - örneğin dosyalarla, ağ istekleriyle ve iletişim protokolleriyle çalışma. Bunun için bayt dizisini metin verilerinden net bir şekilde ayıran, açık ve güvenli bir türe ihtiyaç vardır.
Python'daki bytes türü, 0 ile 255 arasındaki tam sayıların değişmez bir dizisini saklar ve bayt literali (b ile başlayan) veya açık tür dönüşümü ile oluşturulabilir. Str'ler (str) ve baytlar (bytes) arasındaki güvenli ve öngörülebilir etkileşim için .encode() ve .decode() yöntemleri kullanılır. Dosyalar, ağlar ve çeşitli ikili protokollerle çalışırken bytes ana seçimdir.
Kod örneği:
# bytes nesnesi oluşturma b = b'hello' # Literalle b2 = bytes([104, 101, 108, 108, 111]) # Tam sayılar listesinden # str <=> bytes dönüşümü text = 'metin' bin_text = text.encode('utf-8') # str -> bytes back = bin_text.decode('utf-8') # bytes -> str # Dosyayla örnek with open('file.bin', 'rb') as f: data = f.read() # data: bytes
Ana özellikler:
bytes ve str'yi bir değişkene birleştirebilir miyiz?
Hayır, + veya f-string ile birleştirme işe yaramaz: b'abc' + 'def' ifadesini çalıştırmaya çalışmak TypeError ile sonuçlanır. Türleri açıkça dönüştürmek gerekir.
bytes ile bytearray arasındaki fark nedir?
bytes — değişmez bir türdür, yani içerik oluşturulduktan sonra değiştirilemez. bytearray — değiştirilebilir bir varyanttır, yerinde baytları değiştirme yöntemlerini destekler.
b = bytes([1, 2, 3]) # immutable ba = bytearray([1, 2, 3]) # mutable ba[0] = 99 # TAMAM b[0] = 99 # TypeError
encode() ile dönüşüm sırasında bir stringin ne kadar bayt kaplayacağını nasıl öğrenebilirim?
Bayt sayısı kodlamaya bağlıdır. Örneğin, utf-8 için 'abc' 3 bayt, 'Merhaba' 12 bayttır. encode() çağrısından sonra tam boyutu len() ile öğrenebilirsiniz:
s = 'Merhaba' # 6 harf b = s.encode('utf-8') # 12 bayt print(len(b)) # 12
Geliştirici 'rb' (bayt) modunda bir dosyayı okur ve hemen bir dize olarak işlemeye çalışır:
with open('file.txt', 'rb') as f: for line in f: print(line.strip()) # line: bytes
Artılar:
Eksiler:
Geliştirici, bayt akışlarını decode() ile işler, kodlama kontrolünü etkinleştirir:
with open('file.txt', 'rb') as f: for line in f: print(line.decode('utf-8').strip())
Artılar:
Eksiler: