Domanda

Sto lavorando a una serie di parser dove ottengo un sacco di tracebacks dai miei test unit come:

  File "c:\Python31\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 112: character maps to <undefined>
.

I file sono aperti con Open () senza argumenti extra.Posso superare argomenti extra per aprire () o utilizzare qualcosa nel modulo Codec per aprirli in modo diverso?

Ciò ha trovato il codice scritto in Python 2 e convertito in 3 con lo strumento 2to3.

Aggiornamento: si scopre che questo è il risultato di alimentare una Zipfile nel parser.Il test dell'unità si aspetta effettivamente che ciò accada.Il parser dovrebbe riconoscerlo come qualcosa che non può essere analizzato.Quindi, ho bisogno di cambiare la mia gestione delle eccezioni.Nel processo di farlo ora.

È stato utile?

Soluzione

Posizione 0x81 non è assegnata in Windows-1252 (AKA CP1252).È assegnato a U + 0081 High Ottet Preset PRESET (HOP) Carattere di controllo in Latin-1 (AKA ISO 8859-1).Posso riprodurre il tuo errore in Python 3.1 come questo:

>>> b'\x81'.decode('cp1252')
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 0: character maps to <undefined>
.

o con un file effettivo:

>>> open('test.txt', 'wb').write(b'\x81\n')
2
>>> open('test.txt').read()
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 0: unexpected code byte
.

Ora per trattare questo file come latino-1 Passi dell'argomento encoding, come CodeaPe suggerito:

>>> open('test.txt', encoding='latin-1').read()
'\x81\n'
.

Attenzione che ci sono differenze tra Windows-1257 e codifiche latine-1, ad es.Latin-1 non ha "citazioni intelligenti".Se il file che stai elaborando è un file di testo, chiediti cosa sta facendo \ x81 in esso.

Altri suggerimenti

Puoi rilassare la gestione degli errori.

Ad esempio:

f = open(filename, encoding="...", errors="replace")
.

o:

f = open(filename, encoding="...", errors="ignore")
.

Vedi I Documenti .

Modifica:

Ma sei sicuro che il problema è leggere il file?Potrebbe essere che l'eccezione accada quando qualcosa è scritto nella console?Controlla http://wiki.python.org/Moin/Printfails

Tutti i file sono "non unicode". Unicode è una rappresentazione interna che deve essere codificata. È necessario determinare per ciascun file quale codifica è stata utilizzata e specificare che è necessario quando il file è aperto.

come il messaggio di traceback ed errore indica , il file in questione non è codificato in cp1252.

Se è codificato in latin1, il "\x81" di cui si è lamentarsi è un carattere di controllo C1 che non ha nemmeno un nome (in Unicode). Considerare latin1 Estremamente improbabile che sia valido.

Dici "Alcuni dei file vengono analizzati con XML.DOM.MINIDOM" - analizzato con successo o senza successo?

Un file XML valido dovrebbe dichiarare la sua codifica (impostazione predefinita è UTF-8) nella prima riga e non è necessario specificare una codifica nel codice. Mostraci il codice che stai utilizzando per eseguire l'analisi XML.DOM.MINIDOM.

"Altri leggono direttamente come iterali" - codice di esempio per favore.

Suggerimento: prova a aprire alcuni di ogni tipo di file nel tuo browser. Quindi fare clic su Visualizza e fai clic su Carattere Codifica (Firefox) o Codifica (Internet Explorer). Quale codifica ha il browser ha indovinato [di solito affidabile]?

Altri possibili indizi di codifica: quali lingue vengono utilizzate nel testo nei file? Da dove hai preso i file?

Nota: si prega di modificare la tua domanda con le informazioni chiarezza; Non rispondere nei commenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top