Domanda

Supponiamo Sto leggendo un file contenente 3 comma numeri separati. Il file è stato salvato con con una codifica sconosciuta, finora ho a che fare con ANSI e UTF-8. Se il file è stato in UTF-8 e aveva 1 riga con valori 115,113,12 poi:

with open(file) as f:
    a,b,c=map(int,f.readline().split(','))

getterebbe questo:

invalid literal for int() with base 10: '\xef\xbb\xbf115'

Il primo numero è sempre storpiato con questi personaggi '\ XEF \ xbb \ XBF'. Per il resto 2 numeri la conversione funziona bene. Se io sostituire manualmente '\ XEF \ xbb \ XBF' con '' e poi fare la conversione int che funzionerà.

C'è un modo migliore di fare questo per qualsiasi tipo di file codificato?

È stato utile?

Soluzione

import codecs

with codecs.open(file, "r", "utf-8-sig") as f:
    a, b, c= map(int, f.readline().split(","))

Questo funziona in Python 2.6.4. La chiamata codecs.open apre i dati del file e restituisce come unicode, decodifica da UTF-8 e ignorando la distinta iniziale.

Altri suggerimenti

quello che stai vedendo è una codifica UTF-8 BOM , o "Byte Order Mark". La distinta base non viene di solito utilizzato per UTF-8 file, quindi il modo migliore per gestire la cosa potrebbe essere quella di aprire il file con un codec UTF-8, e saltare sul carattere U+FEFF se presente.

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