Ana içeriğe geç

Python'da Bytes'ı String'e Nasıl Dönüştürürsünüz

Python’da bytes’ı string’e dönüştürmek için uygun kodlamayı belirterek .decode() yöntemini kullanabiliriz.
· 8 dk. oku

Yapay Zeka ile Keşfedin

Python’daki daha az bilinen yerleşik dizilerden biri, değiştirilemeyen bir tamsayı dizisi olan bytes tipidir. Her tamsayı bir veri baytını temsil eder. Veriler sıklıkla ağlar ve programlar arasında baytlar halinde iletilir. Bytes insan tarafından okunabilir değildir ve Python programlarımızda sıklıkla bunları string’lere dönüştürmemiz gerekir.

Bu eğitimde Python’da bytes’tan string’e dönüştürme tekniklerini inceleyeceğiz. Ters işlemle ilgileniyorsanız, Python’da string’leri bytes’a nasıl dönüştüreceğinize dair eğitimime göz atın.

Acele edenler için kısa bir yanıtla başlayalım.

Kısa Cevap: Python’da Bytes String’e Nasıl Dönüştürülür

Python’da bytes’ı string’e dönüştürmenin temel aracı .decode() yöntemidir:

data = b"\xc3\xa9clair"
text = data.decode(encoding="utf-8")
print(text)
éclair

.decode() yöntemi, bytes nesnesini temsil eden bir string döndürür. Bu örnekte UTF-8 çözme (decoding) kullanılır. UTF-8 varsayılan kodlamadır; bu nedenle yukarıdaki örnekte belirtilmesi zorunlu değildir, ancak diğer kodlamalar da kullanılabilir.

Python’da Bytes ve String’leri Anlamak

Python’da yerleşik bir bytes veri yapısı vardır; bu, 0 ile 255 arasındaki tamsayılardan oluşan değiştirilemeyen bir dizidir. Bu 256 sayılık aralıktaki bir tamsayı, sekiz bit veri kullanılarak temsil edilebilir; bu da bir bayta eşittir. Dolayısıyla, bir bytes nesnesindeki her öğe bir baytı temsil eden bir tamsayıdır.

Bir listeden bir bytes nesnesi oluşturmak için bytes() yapıcıyı kullanalım:

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(type(data))
<class 'bytes'>

Bu tamsayı dizisi değiştirilemez:

data[0] = 100
Traceback (most recent call last):
 ...
   data[0] = 100
   ~~~~^^^
TypeError: 'bytes' object does not support item assignment

Bu dizideki bir değeri değiştirmeye çalıştığımızda Python bir TypeError yükseltir. Bir bytes nesnesinin yalnızca 0 ile 255 arasındaki tamsayıları içerebileceğini doğrulayalım:

data = bytes([254, 255, 256])
Traceback (most recent call last):
 ...
   data = bytes([254, 255, 256])
          ^^^^^^^^^^^^^^^^^^^^^^
ValueError: bytes must be in range(0, 256)

ValueError, bir baytı temsil eden tamsayının range(0, 256) içinde olması gerektiğini belirtir. Aralıktaki bitiş değeri dışlanır; bu, Python’daki sayı aralıklarında alışılmış bir kuraldır.

print() ile bytes nesnesini görüntüleyebiliriz:

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(data)
b'DataCamp'

Temsil, karakterlerle gösterilen bir bytes nesnesini gösterir. Python, tamsayıları karşılık gelen ASCII karakterleriyle görüntüler. Tırnak içindeki karakterlerin başındaki b öneki, bunun bir bytes nesnesi olduğunu gösterir.

bytes literalini doğrudan kullanarak da bir bytes nesnesi oluşturabiliriz:

data = b"DataCamp"
print(data)
print(data[0])
b'DataCamp'
68

Nesne karakterlerle görüntülenir, ancak öğeleri tamsayılardır.

Ancak, bytes nesneleri yalnızca yazdırılabilir ASCII karakterlerine karşılık gelen tamsayılar kullanıldığında insan tarafından okunabilirdir. ASCII 7 bitlik bir kodlama olduğundan 128 kod içerir, ancak bu ASCII karakterlerinin yalnızca 95’i yazdırılabilirdir.

Yazdırılabilir bir ASCII karakteri olmayan 0 ile 127 arasındaki tamsayılar ile 128 ile 255 arasındaki tamsayılar onaltılık (hex) sayılar olarak görüntülenir:

data = bytes([0, 68, 97, 116, 97, 67, 97, 109, 112, 200])
print(data)
b'\x00DataCamp\xc8'

Listedeki ilk tamsayı artık 0’dır; bu, ASCII’de yazdırılabilir bir karakter değildir. bytes nesnesi bu tamsayıyı 0’ın onaltılık gösterimi olan \x00 ile görüntüler. Son tamsayı 200’dür; bu, ASCII aralığının dışında olsa da bytes’ta kullanılabilecek tamsayı aralığındadır. Python bu tamsayıyı 200’ün onaltılık karşılığı olan \xc8 olarak görüntüler.

bytes ve string veri yapıları ortak özellikler paylaşır. Her ikisi de değiştirilemeyen dizilerdir; ancak bytes tamsayı içerirken string’ler karakter içerir:

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(data[0])

​text = "DataCamp"
print(text[0])
68
D

Bytes, verileri ağlar ve farklı arayüzler arasında taşımak için kullanılır. Bu makalenin bir sonraki bölümünde bytes’tan string’e nasıl dönüştürüleceğini inceleyeceğiz.

.decode() Yöntemiyle Bytes’tan String’e Dönüştürme

Python’daki bir bytes nesnesi yalnızca okunabilir ASCII karakterler içerdiğinde insan tarafından okunabilirdir. Çoğu uygulamada bu karakterler yeterli değildir. Bir bytes nesnesini .decode() yöntemiyle bir string’e dönüştürebiliriz:

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
text = data.decode()

print(text)
print(type(text))
DataCamp
<class 'str'>

Ancak, bytes ve string’ler arasında dönüştürmek için farklı kodlamalar vardır. Yukarıdaki örnekteki tamsayılar yazdırılabilir ASCII karakterlerini temsil eder. Bununla birlikte, .decode() yöntemine argüman verilmediğinde kullanılan varsayılan kodlama UTF-8’dir, ASCII değil. UTF-8, Unicode karakterleri için en yaygın kullanılan kodlamadır.

İlk 128 UTF-8 kodu ASCII kodlarıyla eşleşir; bu nedenle, yukarıdaki örnekte bytes nesnesi "DataCamp" string’ine çözümlenir.

Bununla birlikte, Unicode neredeyse 150.000 karakter içerir. UTF-8, ASCII dışındaki tüm Unicode karakterlerini iki veya daha fazla bayt kullanarak kodlar.

Yeni bir bytes nesnesi oluşturalım ve onu çözelim (decode edelim):

data = bytes([195, 169])
print(data)

text = data.decode()
print(text)
b'\xc3\xa9'
é

bytes nesnesi iki bayt içerir: 195 ve 169 tamsayıları. Python bu baytların onaltılık gösterimini görüntüler. Ancak .decode(), bytes nesnesini UTF-8 kodlamasını kullanarak çözüp bir string döndürür. b'\xc3\xa9' bayt çifti, keskin aksanlı e harfini, yani é karakterini temsil eder.

.decode() yöntemi, kodlamayı belirtmek için isteğe bağlı bir argüman alır:

text = data.decode("utf-8")
print(text)
é

UTF-8 varsayılan kodlamadır, ancak başka kodlamalar da kullanılabilir. Bir string’i farklı kodlamalarla .encode() yöntemini kullanarak bir bytes nesnesine de dönüştürebiliriz:

text = "éclair"
data = text.encode("utf-8")
print(data)

data = text.encode("utf-16")
print(data)
b'\xc3\xa9clair'
b'\xff\xfe\xe9\x00c\x00l\x00a\x00i\x00r\x00'

Aynı string, hangi karakter kodlamasını kullandığımıza bağlı olarak farklı bytes nesnelerine dönüşür.

Kodlama Hataları

Karakter kodlaması seçimi, bytes ve string’ler arasında dönüştürme yapılırken farklı bir kodlama kullanılırsa hatalara yol açabilir. UTF-8 kodlaması kullanılarak bytes’a dönüştürülmüş "éclair" string’iyle olan örneği kullanalım:

text = "éclair"
data = text.encode("utf-8")
print(data)
b'\xc3\xa9clair'

Bu bayt dizisi, karakterleri UTF-8 kodlamasıyla temsil eder. Yanlış kodlama kullanırsak .decode() yöntemi bir hata yükseltir:

text = data.decode("ascii")
print(text)
Traceback (most recent call last):
 ...
   text = data.decode("ascii")
          ^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

Bununla birlikte, hataları ele almak için isteğe bağlı errors argümanını ekleyebiliriz. errors parametresinin varsayılan değeri, geçersiz karakterler için hata yükselten "strict"tir.

.decode() yöntemini, tüm geçersiz karakterleri yok saymak için errors="ignore" ile çağırabiliriz:

text = data.decode("ascii", errors="ignore")
print(text)
clair

Orijinal string’deki ilk karakter é’dir ve bu bir ASCII karakteri değildir. Bu nedenle .decode(), ilk karakter olmadan bir string döndürür.

Bir diğer seçenek de geçersiz baytları � ile değiştiren errors="replace" ile .decode() çağırmaktır:

text = data.decode("ascii", errors="replace")
print(text)
��clair

Bu çıktı, string’den karakterlerin eksik olduğunu gösterir. Hata işleme seçimi uygulamaya bağlıdır.

str() ile Bytes’tan String’e Dönüştürme

.decode() yöntemi, bytes’ı string’e dönüştürmenin ana yoludur. Ancak, doğrudan str() yapıcısını kullanmak da mümkündür. Bir bytes nesnesi üzerinde str() yapıcısını kullanmak, ham baytların string temsili oluşturur:

data = b'\xc3\xa9clair'
text = str(data)

print(text)
print(type(text))
b'\xc3\xa9clair'
<class 'str'>

Bununla birlikte, str() yapıcısı bir encoding argümanını da kabul eder; bunu kullanarak belirli bir kodlamaya göre bir string oluşturabiliriz:

text = str(data, encoding='utf-8')
print(text)
éclair

codecs.decode() ile Bytes’tan String’e Dönüştürme

Python’un standart kitaplığındaki codecs modülü, verileri kodlama ve kod çözme için bir arayüz sağlar. Bu modül, Python bytes’ı string’e dönüştürmek için kullanılabilecek bir .decode() işlevi de sunar:

import codecs

​data = b'\xc3\xa9clair'
text = codecs.decode(data, encoding='utf-8')
print(text)
éclair

Bu alternatif dönüşüm teknikleri, bytes tipinin yöntemleri değil; bytes nesnesinin argüman olarak geçirilmesini gerektiren işlevlerdir.

Sonuç

Veriler sıklıkla baytlar halinde aktarılır ve birçok Python uygulaması bytes ile string’ler arasında dönüşüme ihtiyaç duyar. Bir bytes nesnesi, çeşitli karakter kodlamalarından biri kullanılarak bir string’e dönüştürülebilen değiştirilemeyen bir bayt dizisidir.

Python bytes’ı string’e dönüştürmenin ana yolu, kullanıcıların bir kodlama ve hata işleme stratejisi seçmesine olanak tanıyan .decode() yöntemidir.

Python öğreniminize şu eğitim ve kurslarla devam edebilirsiniz:

Stephen Gruppetta

Yazar

Stephen Gruppetta

Malta Üniversitesi’nde lisans düzeyinde Fizik ve Matematik okudum. Ardından Londra’ya taşındım ve Imperial College’da Fizik alanında doktoramı tamamladım. İnsan retinasını görüntülemek için yeni optik teknikler üzerine çalıştım. Şimdi Python hakkında yazmaya, Python’u anlatmaya ve Python öğretmeye odaklanıyorum.

Konular

İlgili