Okurken UnicodeDecodeError
pd.read_csv UTF-8 bekler. Dosya Windows-1254 (Türkçe ANSI) ile kaydedildiyse pandas UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfd in position 12: invalid start byte hatasıyla durur – 0xFD Windows-1254’te ı harfidir. O zaman kodlamayı belirtin:
- Excel ve Türkçe Windows’tan gelen dosyalar için
pd.read_csv('veri.csv', encoding='cp1254'). encoding='latin-1'hata vermez amaı,ş,ğgibi harfleri yanlış okur – Türkçedecp1254doğru seçimdir.- Kodlamayı bilmiyorsanız dosyayı Mojibuster’a bırakın: kodlamayı bulur ve dosyayı UTF-8 kaydeder.
DataFrame’de ş yerine ÅŸ
DataFrame ÅŸ ve ı gösteriyorsa UTF-8 dosya latin-1 ya da cp1252 olarak okunmuştur – veya veri daha önce bozulmuştur. İlk durumda encoding='utf-8' yeter. Verinin kendisi bozuksa tek tek değerler için deger.encode('cp1252').decode('utf-8') işe yarar. Karışık verilerde ise bir hücre zaten doğruysa başarısız olur. Daha kolayı: dosyayı Mojibuster ile onarın, sonra okuyun.
Önce
ad,sehir,ciro Şule Çelik,İstanbul,1250 ₺ Oğuz Işık,Eskişehir,980 ₺
Sonra
ad,sehir,ciro Şule Çelik,İstanbul,1250 ₺ Oğuz Işık,Eskişehir,980 ₺
to_csv: Excel dosyayı yanlış gösteriyor
df.to_csv('cikti.csv') BOM’suz UTF-8 yazar. Excel böyle dosyaları ANSI olarak açar ve Türkçe harfler ÅŸ gibi bozulur. encoding='utf-8-sig' ile pandas BOM yazar ve Excel UTF-8’i tanır. Ayrıntı için Excel’de Türkçe karakter sorunu.
Windows’ta open()
encoding vermeden open('dosya.txt') Windows’ta sistem kodlamasını kullanır, Türkçe kurulumda bu cp1254’tür. Linux’ta çalışan bir betik Windows’ta aynı UTF-8 dosyayı ÅŸ olarak okur. Bu yüzden her zaman encoding='utf-8' verin ya da PYTHONUTF8=1 ortam değişkenini ayarlayın. PEP 686 ile ilerideki Python sürümlerinde UTF-8 zaten varsayılan olacak.
requests ile web verisi
requests, response.text değerini Content-Type başlığından türetir. Metin yanıtı orada karakter seti belirtmezse ISO-8859-1 varsayar ve UTF-8 sayfalar ÅŸ gösterir. Önce response.encoding = 'utf-8' atayın ya da UTF-8’i kendisi bulan response.json() kullanın.
Metin errors='replace' ile gerekli karakterleri içermeyen bir kodlamaya yazıldıysa dosyada ? vardır – bilgi kaybolmuştur, bkz. Türkçe harfler yerine soru işareti.
Sık sorulan sorular
Bunun için bir Python kütüphanesi var mı?
Evet, ftfy mojibake’yi Python kodunda düzeltir. Programlama yapmadan tek dosya için Mojibuster daha hızlıdır ve kaydetmeden önce her değişikliği gösterir.
En çok hangi encoding değerleri gerekir?
utf-8, utf-8-sig (BOM’lu UTF-8), cp1254 (Windows, Türkçe), iso-8859-9, latin-1 ve utf-16. Büyük/küçük harf ve tire fark etmez.
Ayraçlar ve sayılar korunuyor mu?
Evet. Mojibuster yalnızca bozuk karakterleri değiştirir. Virgüller, tırnaklar ve satır sonları aynen kalır.