Portál AbcLinuxu, 8. května 2025 06:45
Zdar a sílu,
řeším následující problém: Mám program v Pythonu 3, který mj. potřebuje načíst nějaká data z CSV souboru. Python 3 normálně používá pro řetězce Unicode a zjevně vyžaduje UTF-8 (u souborů) na vstupu (když jsem mu předhodil soubor s diakritikou v kódování windows-1250, zařval, že chce utf8). Na několika linuxových mašinách s Pythonem 3.1.3 a UTF-8 nebyl problém se vstupním souborem v UTF-8, ale na MS Windows Vista prý řve:
Traceback (most recent call last): File "tui.py", line 91, in <module> deck.csv_import(filename) File "D:\zima\backend.py", line 83, in csv_import for row in reader: File "c:\Python31\lib\encodings\cp1250.py", line 23, in decode return codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError: 'charmap' codec can't decode byte 0x88 in position 118: character maps to <undefined>
Ta (ne)zajímavá část programu je jednoduché:
reader = csv.reader(open(filename)) for row in reader: self.add(Card(row[0], row[1]))
Dělám někde chybu já? Nebo je chyba v Pythonu/jehoVistách? Jak zařídit nějakou použitelnou automatickou detekci kódování?
Řešení dotazu:
open
lze předat parametr encoding, asi by tedy pomohlo něco takového: csv.reader(open(filename, 'utf8'))
Automatická detekce není stoprocentní, ale můžeš zkusit chardet. Asi jediné kódování, které lze přesně detekovat, je UTF-16, protože text v UTF-16 by měl na začátku obsahovat BOM (byte order mark).
python 3 nevyzaduje utf-8, on ho pouze predpoklada .... a jak bylo receno vyse funkce open() ma parametr encoding ...
a dobre je se podivat obcas zde : http://docs.python.org/py3k/
a zapomnel sem dodat ze widle jsou vnitrne UTF-16 a;e kvuli spetne kompaktibilite ukladaji vse v narodnim WIN kodovani .. --> u CZ varianty WIN-1250 ...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.