Ana içeriğe geç

Python’da String’i Baytlara Dönüştürme

Python’da, bir string’i baytlara dönüştürmek için .encode() yöntemini kullanın; istenirse kodlamayı (varsayılan UTF-8) belirtin.
· 7 dk. oku

Yapay Zeka ile Keşfedin

String’ler insan tarafından okunabilir metni temsil eder ve bilgisayar programlamadaki en temel ve önemli veri tiplerinden biridir. Ancak, bir metin dizisindeki her karakter bir veya daha fazla bayt ikili veriyle temsil edilir. Girdi/çıktı işlemleri ve veri iletimi gibi uygulamalar, string’lerin belirli bir kodlama kullanılarak baytlara dönüştürülmesini gerektirir.

Bu eğitimde Python’da string’leri baytlara dönüştürme tekniklerini inceleyeceğiz. Tersine işlemi merak ediyorsanız, Python’da baytların string’e nasıl dönüştürüleceğine ilişkin eğitimime göz atın.

Ayrıntılara girmeden önce, acelesi olanlar için kısa bir yanıtla başlayalım.

Kısa Cevap: Python’da String’i Baytlara Nasıl Dönüştürürsünüz?

Python, yerleşik .encode() yöntemiyle bir string’i baytlara dönüştürmeyi kolaylaştırır:

my_string = "Hello, world!"
bytes_representation = my_string.encode(encoding="utf-8")  
# Optional: Specify the desired encoding (UTF-8 is the default)

print(bytes_representation)
# Output: b'Hello, world!'

.encode() yöntemi, özgün string’in kodlanmış sürümünü temsil eden yeni bir bytes nesnesi döndürür. Varsayılan olarak UTF-8 kullanılır, ancak gerekirse 'ascii' veya 'latin-1' gibi diğer kodlamaları da belirtebilirsiniz.

Şimdi bu dönüştürme sürecini daha ayrıntılı inceleyelim.

Python’da String ve Bytes’ı Anlamak

Python’daki temel yerleşik veri tiplerinden ikisi str ve bytes’tır. Bu veri tipleri ortak özellikler taşısa da önemli farkları vardır.

str ve bytes her ikisi de değiştirilemeyen (immutable) sıralardır; yani oluşturulduktan sonra öğelerini değiştiremeyiz. String, karakterlerden oluşan değiştirilemeyen bir diziyken, bir bytes nesnesi 0 ile 255 arasındaki tamsayılardan oluşan değiştirilemeyen bir dizidir. Bu tamsayı aralığı 8 bit ile, yani bir baytla temsil edilebilir. Dolayısıyla bir bytes nesnesi bir bayt dizisidir.

ASCII karakter kodlaması

Önce ASCII karakterlerini ele alalım. ASCII (American Standard Code for Information Interchange), yalnızca 128 karakter içeren bir karakter kodlamasıdır. Bu nedenle, herhangi bir ASCII karakteri yedi bit ile temsil edilebilir; bu da bir bayttan azdır.

Normalde string’ler için kullandığımız tek, çift veya üç tırnağın önüne b ekleyerek bir bytes nesnesi oluşturabiliriz:

word_as_bytes = b"Python"
print(word_as_bytes)
print(type(word_as_bytes))
b'Python'
<class 'bytes'>

Kod, Python’u oluşturan karakterleri gösterse de bytes nesnesindeki her öğe 0 ile 255 arasındaki bir tamsayıdır:

print(word_as_bytes[0])
print(list(word_as_bytes))
80
[80, 121, 116, 104, 111, 110]

word_as_bytes’in ilk öğesi büyük P için ASCII kodu olan 80’dir:

print(chr(80))
P

word_as_bytes’i listeye çevirdiğimizde, liste her baytı temsil eden tamsayıları içerir. Bu tamsayılar Python kelimesindeki harflerin ASCII kodlarıdır.

Ancak ASCII karakter kümesi sınırlıdır.

UTF-8 karakter kodlaması

En yaygın karakter kodlaması, 8 bitlik bir Unicode kodlaması olan UTF-8’dir. 128 ASCII karakteri UTF-8’de de aynı tamsayılarla temsil edilir, ancak diğer karakterler her bir karakter için iki veya daha fazla bayt kullanılarak temsil edilebilir.

ASCII olmayan karakterler kullanarak bir bytes nesnesi oluşturalım. Bunun için bytes() yapıcısını kullanmamız gerekir:

word_as_bytes = bytes("café", "utf-8")
print(word_as_bytes)
b'caf\xc3\xa9'

bytes nesnesi, café kelimesinin ilk üç harfini doğrudan gösterir. Ancak aksanlı é bir ASCII karakteri değildir ve iki baytla temsil edilir; bunlar \xc3 ve \xa9 olarak gösterilir. Bu baytlar onaltılık c3 ve a9 sayılarıdır; yani 195 ve 169 tamsayıları. Bu iki bayt birlikte UTF-8’de é’yi temsil eder:

print(len(word_as_bytes))
print(list(word_as_bytes))
5
[99, 97, 102, 195, 169]

Beş öğeli bir bytes nesnesi, dört harfli string’i temsil eder.

String’leri Baytlara Dönüştürme: encode() Yöntemi

Daha önce, bir metin string’ini bir bytes nesnesine dönüştürmek için bytes() yapıcısını kullandık. Python string’lerini baytlara dönüştürmenin daha yaygın yolu, kodlama ve hata yönetimi üzerinde kontrol sağlayan .encode() string yöntemini kullanmaktır. Bu yöntem, string’i temsil eden bir bytes nesnesi döndürür:

word_as_bytes = "Hello Python!".encode()
​print(word_as_bytes)
print(type(word_as_bytes))
b'Hello Python!'
<class 'bytes'>

.encode() yöntemi varsayılan olarak UTF-8 kodlamasını kullanır. UTF-8 en yaygın kullanılan kodlama biçimidir ve ASCII’den çok daha geniş bir karakter aralığını destekler. UTF-8, her karakteri bir, iki, üç veya dört baytlık birimlerin dizisiyle temsil eder.

.encode() yöntemini, argüman olarak alternatif bir kodlamayla çağırabiliriz:

word_as_bytes = "Hello Python!".encode("utf-16")
print(word_as_bytes)
b'\xff\xfeH\x00e\x00l\x00l\x00o\x00 \x00P\x00y\x00t\x00h\x00o\x00n\x00!\x00'

Bu durumda bytes nesnesi farklıdır; çünkü aynı metin string’inin UTF-16 ile kodlanmış halini temsil eder.

Kodlama Hataları

Tüm kodlamalar tüm karakterleri içermediğinden, bir string’i bir bytes nesnesine kodlarken hatalar ortaya çıkabilir.

Üç adet ASCII olmayan karakter içeren "Café • £2.20" string’ini ele alalım. Bunu varsayılan UTF-8 kodlamasıyla kodlayabiliriz:

word_as_bytes = "Café • £2.20".encode()
print(word_as_bytes)
b'Caf\xc3\xa9 \xe2\x80\xa2 \xc2\xa32.20'

ASCII olmayan karakterler, onaltılık kaçış dizileriyle değiştirilir. Ancak aynı string ASCII kullanılarak kodlanırsa, ASCII kodlamasında bulunmayan birkaç karakter olduğundan .encode() bir hata yükseltir:

word_as_bytes = "Café • £2.20".encode("ascii")
print(word_as_bytes)
Traceback (most recent call last):
...
word_as_bytes = "Café • £2.20".encode("ascii")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 3: ordinal not in range(128)

.encode() string yönteminin varsayılan değeri "strict" olan bir errors parametresi vardır. "strict" argümanı, bir karakter kodlanamadığında .encode()’in bir UnicodeEncodeError yükseltmesini zorunlu kılar.

Bununla birlikte, hataları ele almak için başka seçenekler de vardır. Seçeneklerden biri, "ignore" argümanını kullanarak hataları yoksaymaktır:

word_as_bytes = "Café • £2.20".encode("ascii", errors="ignore")
print(word_as_bytes)
b'Caf 2.20'

Bu seçenek bir hata yükseltmez. Bunun yerine .encode() bir bytes nesnesi döndürür ve aksanlı é, madde imi ve sterlin işareti atlanır.

Bir diğer seçenek, kodlanamayan karakterleri başka bir şeyle değiştirmektir. Birkaç değiştirme seçeneği vardır. Bunlardan biri errors="replace" argümanıdır:

word_as_bytes = "Café • £2.20".encode("ascii", errors="replace")
print(word_as_bytes)
b'Caf? ? ?2.20'

Bu örnekte kodlanamayan üç ASCII dışı karakter soru işaretiyle değiştirilir. Böylece her eksik karakter, yer tutucu olarak işlev gören tek bir başka karakterle değiştirilmiş olur.

Eksik karakterleri daha bilgilendirici metinlerle de değiştirebiliriz:

word_as_bytes = "Café • £2.20".encode("ascii", errors="backslashreplace")
print(word_as_bytes)
b'Caf\\xe9 \\u2022 \\xa32.20'

errors="backslashreplace" ile .encode() çağrıldığında, kodlanamayan karakterler onaltılık kaçış dizileriyle değiştirilir. e9 onaltılık sayısı aksanlı é’yi temsil eder. Madde imi u2022 Unicode karakteridir ve a3 onaltılık sayısı sterlin işaretini temsil eder.

Eksik karakterleri XML kodlarıyla değiştirmek için "xmlcharrefreplace" de kullanılabilir:

word_as_bytes = "Café • £2.20".encode("ascii", errors="xmlcharrefreplace")
print(word_as_bytes)
b'Caf&#233; &#8226; &#163;2.20'

errors="namereplace" kullanarak geçersiz karakterleri resmi adlarıyla değiştirmek de başka bir seçenektir:

word_as_bytes = "Café • £2.20".encode("ascii", errors="namereplace")
print(word_as_bytes)
b'Caf\\N{LATIN SMALL LETTER E WITH ACUTE} \\N{BULLET} \\N{POUND SIGN}2.20'

Farklı durumlar özelleştirilmiş hata yönetimi gerektirebilir ve .encode() string yöntemi, kodlanamayan karakterlerle başa çıkmak için çeşitli seçenekler sunar.

Veri Biliminde String’ten Bayta Dönüşümün Kullanım Alanları

String’ten bayta dönüşüm, çeşitli veri bilimi alanlarında uygulama bulan temel bir işlemdir:

  • Doğal dil işleme (NLP): Duygu analizi, konu modelleme veya makine çevirisi gibi görevler için metinle çalışırken, metni genellikle kelimelere veya alt kelimelere ayırarak ön işleriz. Bu belirteçleştirme süreci sıkça, verimli temsil ve işleme için string’lerin bayt dizilerine dönüştürülmesini içerir.
  • Veri temizleme ve ön işleme: Bayt düzeyindeki işlemler, geçersiz karakterleri kaldırma veya belirli bayt kalıplarına göre metni normalleştirme gibi metin verilerini temizlemede faydalı olabilir.
  • Özellik mühendisliği: Bazı durumlarda, metin verilerinden bayt düzeyinde özellikler (ör. bayt n-gram’ları) çıkarılarak makine öğrenimi modellerine girdi olarak kullanılabilir.
  • Web kazıma ve veri çıkarma: Web sitelerinden veri kazırken, çoğu zaman ilgili bilgiyi çıkarmak için bayt düzeyinde ayrıştırılması ve işlenmesi gereken HTML veya diğer metin tabanlı içerikler elde ederiz.
  • Veri sıkıştırma: Bazı veri sıkıştırma algoritmaları bayt dizileri üzerinde çalışır; dolayısıyla string’leri baytlara dönüştürmek, sıkıştırma tekniklerini uygulamadan önce gerekli bir adım olabilir.

Bu kullanım alanlarını anlamak, string’leri baytlara dönüştürmenin faydalı olabileceği durumları belirlememize yardımcı olur.

Sonuç

String’ler, insan tarafından okunabilir karakter dizileridir. Bu karakterler, bir bytes nesnesinde saklanabilen ikili veri baytları olarak kodlanır. Bir bytes nesnesi bir tamsayı dizisidir ve her tamsayı bir baytı temsil eder.

Uygulamalar, string’lerin bytes nesnelerine dönüştürülmesini gerektirir; bunu bytes() yapıcısını veya string .encode() yöntemini kullanarak gerçekleştirebiliriz. String ile bytes arasındaki dönüşümü öğrenmek, daha esnek veri işleme olanağı sağlar.

Python öğreniminize aşağıdaki eğitim ve kurslarla devam edebilirsiniz:

String’ten Bayta Dönüşüm SSS

str ile bytes arasındaki fark nedir?

String, değiştirilemeyen bir karakter dizisidir; bytes nesnesi ise değiştirilemeyen bir tamsayı dizisidir. Her tamsayı bir baytı temsil eder.

Bir string’i baytlara dönüştürmek için bytes() mı yoksa str.encode() mı kullanmalıyım?

Python’da string’leri baytlara dönüştürmek için tercih edilen yöntem, kodlama ve hata yönetimi stratejisini seçmede açıklık ve esneklik sunan str.encode() yöntemidir. bytes() yapıcısı ise str.encode()’ın doğrudan uygulanamadığı belirli senaryolarda kullanılabilir.

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