TLDR? Deneyin:file = open(filename, encoding='cp437)
Neden? Biri kullanıldığında:
file = open(filename)
text = file.read()
Python, dosyanın geçerli ortamla aynı kod sayfasını kullandığını varsayar (açılış yazısı durumunda cp1252) ve kendi varsayılan UTF-8 kodunu çözmeye çalışır. Dosya bu kod sayfasında tanımlanmamış değer karakterleri içeriyorsa (0x90 gibi) UnicodeDecodeError alırız. Bazen dosyanın kodlamasını bilmiyoruz, bazen dosyanın kodlaması Python tarafından işlenmeyebilir (örneğin cp790 gibi), bazen dosya karışık kodlamalar içerebilir.
Bu tür karakterler gereksiz ise, bunları soru işaretleriyle değiştirmeye karar verebilirsiniz:
file = open(filename, errors='replace')
Başka bir geçici çözüm kullanmaktır:
file = open(filename, errors='ignore')
Karakterler daha sonra bozulmadan kalır, ancak diğer hatalar da maskelenir.
Oldukça iyi bir çözüm , kodlamayı belirtmek, ancak herhangi bir kodlamayı (cp1252 gibi) değil, TÜM karakterleri tanımlanmış olanı (cp437 gibi) belirtmektir:
file = open(filename, encoding='cp437')
Kod sayfası 437 özgün DOS kodlamasıdır. Tüm kodlar tanımlanmıştır, bu yüzden dosyayı okurken hiçbir hata yoktur, hiçbir hata maskelenmez, karakterler korunur (oldukça sağlam değil, ancak yine de ayırt edilebilir).