Format metodu hakkında

Merhaba

harfler = "abcçdefgğhıijklmnoöprsştuüvyz"
for s in harfler:
    print("{:<5}{:<15}{:<15}".format(s, s.encode("utf-8"), len(s.encode("utf-8"))))

çalıştırınca,

Traceback (most recent call last):
File “/home/orion/Dropbox/PROGRAMLAMA/Python_Projects/Python-3_F_Ozdil_Notlar/bolum_29.py”, line 120, in
print(“{:<5}{:<15}{:<15}”.format(s, s.encode(“utf-8”), len(s.encode(“utf-8”))))
TypeError: unsupported format string passed to bytes.format

hatası alıyorum. Bu sorunun nedeni .format metodunun bayt veri tipini gösterememesi. Çözüm ise str(s.encode("utf-8")) yazmak.

Peki buraya kadar tamam ama o zaman şu kod nasıl TypeError: hatası vermiyor:

kod_çözücüler = ['UTF-8', 'cp1254', 'latin-1', 'ASCII']
harf = 'ç'
for kç in kod_çözücüler:
    try:
        print("'{}' karakteri {} ile {} olarak ve {} sayısıyla temsil edilir. Ayrıca ve {} bayt yer kaplar"
              .format(harf, kç, harf.encode(kç), ord(harf), len(harf.encode(kç))))
    except UnicodeEncodeError:
        print("'{}' karakteri {} ile temsil edilemez!".format(harf, kç))

Yani neden str(harf.encode(kç)) yazmaya gerek kalmadan çalışıyor?

Beklenen veri bytes() veri tipinde değil, veri tipini str() yaparsanız sorun çözülür.

harfler = "abcçdefgğhıijklmnoöprsştuüvyz"
for s in harfler:
    print("{:>15}{:>15}{:>15}".format(s, str(s.encode("UTF-8")), len(s.encode("utf-8"))))

{:>15} biçimini bytes() veri tipinde bir değişkenle kullanamıyoruz.

ama sanırım sadece {} biçimini bytes veri tipiyle kullanabiliyoruz. Doğru mu anladım.?

Bildiğim kadarıyla öyle, evet.

Kitapta genel bir ifade kullanmış. sf 453 'te

“Burada, s.encode(“utf-8”) komutunun ‘baytlar’ (bytes) türünden bir veri tipi verdiğine
dikkat edin (baytlar veri tipini bir sonraki bölümde ayrıntılı olarak inceleyeceğiz). Karakter
dizilerinin aksine baytların format() adlı bir metodu bulunmaz. Bu yüzden, bu veri
tipini format() metoduna göndermeden önce str() fonksiyonu yardımıyla karakter dizisine
dönüştürmemiz gerekiyor.”

demiş o yüzden kafam karışmıştı.

Kitabın önerdiği gibi, bytes() veri tipini aldık str(bytes()) şeklinde str() veri tipine dönüştürdük, öyle çalıştı evet. bytes() için sadece {} biçimini kullanabiliriz.

1 Beğeni