Lettura dei caratteri dal file in Python
Domanda
In un file di testo è presente una stringa " Non mi piace questo " ;.
Tuttavia, quando lo leggo in una stringa, diventa " Io non \ xe2 \ x80 \ x98t come questo " ;. Capisco che \ u2018 è la rappresentazione unicode di " '" ;. Io uso
f1 = open (file1, "r")
text = f1.read()
comando per eseguire la lettura.
Ora, è possibile leggere la stringa in modo tale che quando viene letta nella stringa, è " Non mi piace questo " ;, invece di " Non mi piace \ xe2 \ x80 \ x98t questo come questo " ;?
Seconda modifica: ho visto alcune persone utilizzare la mappatura per risolvere questo problema, ma in realtà non esiste una conversione integrata che fa questo tipo di conversione da ANSI a Unicode (e viceversa)?
Soluzione
Rif: http://docs.python.org/howto/unicode
Leggere Unicode da un file è quindi semplice:
import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
print repr(line)
È anche possibile aprire i file in modalità di aggiornamento, consentendo sia la lettura che la scrittura:
f = codecs.open('test', encoding='utf-8', mode='w+')
f.write(u'\u4500 blah blah blah\n')
f.seek(0)
print repr(f.readline()[:1])
f.close()
MODIFICA : suppongo che il tuo obiettivo sia solo quello di poter leggere correttamente il file in una stringa in Python. Se stai provando a convertire in una stringa ASCII da Unicode, non c'è davvero alcun modo diretto per farlo, poiché i caratteri Unicode non saranno necessariamente presenti in ASCII.
Se stai provando a convertire in una stringa ASCII, prova una delle seguenti opzioni:
-
Sostituisci i caratteri Unicode specifici con equivalenti ASCII, se stai solo cercando di gestire alcuni casi speciali come questo esempio particolare
-
Utilizza il metodo
unicodedata
normalize ()
e il metodostring.encode ()
per convertire il meglio possibile nel il prossimo equivalente ASCII più vicino (Ref https://web.archive.org/web/20090228203858/http://techxplorer.com/2006/07/18/converting-unicode-to-ascii-using-python ):>>> teststr u'I don\xe2\x80\x98t like this' >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore') 'I donat like this'
Altri suggerimenti
Ci sono alcuni punti da considerare.
Un carattere \ u2018 può apparire solo come un frammento di rappresentazione di una stringa unicode in Python, ad es. se scrivi:
>>> text = u'‘'
>>> print repr(text)
u'\u2018'
Ora se vuoi semplicemente stampare la stringa unicode in modo carino, usa il metodo encode
di unicode:
>>> text = u'I don\u2018t like this'
>>> print text.encode('utf-8')
I don‘t like this
Per assicurarti che ogni riga di qualsiasi file venga letta come Unicode, è meglio usare la funzione codecs.open
invece di open
, che ti consente per specificare la codifica del file:
>>> import codecs
>>> f1 = codecs.open(file1, "r", "utf-8")
>>> text = f1.read()
>>> print type(text)
<type 'unicode'>
>>> print text.encode('utf-8')
I don‘t like this
Ma è davvero " Non mi piace questo " e non " Non mi piace " ;. Il carattere u '\ u2018' è un carattere completamente diverso rispetto a " '" (e, visivamente, dovrebbe corrispondere di più a '' ').
Se stai cercando di convertire unicode codificato in semplice ASCII, potresti forse mantenere una mappatura della punteggiatura unicode che vorresti tradurre in ASCII.
punctuation = {
u'\u2018': "'",
u'\u2019': "'",
}
for src, dest in punctuation.iteritems():
text = text.replace(src, dest)
Esistono moltissimi caratteri di punteggiatura in unicode , tuttavia, ma suppongo che tu possa contare solo su alcuni di essi effettivamente utilizzati da qualsiasi applicazione stia creando i documenti che stai leggendo.
Lasciando da parte il fatto che il tuo file di testo è rotto (U + 2018 è una virgoletta sinistra, non un apostrofo): iconv può essere usato per traslitterare caratteri unicode in ascii.
Dovrai cercare Google per " iconvcodec " ;, poiché il modulo sembra non essere più supportato e non riesco a trovare una home page canonica per esso.
>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"
In alternativa puoi usare l'utilità della riga di comando iconv
per ripulire il tuo file:
$ xxd foo
0000000: e280 980a ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a '.
C'è la possibilità che in qualche modo tu abbia una stringa non unicode con caratteri di escape unicode, ad es .:
>>> print repr(text)
'I don\\u2018t like this'
Questo in realtà mi è successo una volta prima. Puoi utilizzare un codec unicode_escape
per decodificare la stringa in unicode e quindi codificarla nel formato che desideri:
>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this
Questo è il modo in cui Pythons ti mostra le stringhe codificate unicode. Ma penso che dovresti essere in grado di stampare la stringa sullo schermo o scriverla in un nuovo file senza problemi.
>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this
In realtà, U + 2018 è la rappresentazione Unicode del carattere speciale ". Se lo desideri, puoi convertire le istanze di quel personaggio in U + 0027 con questo codice:
text = text.replace (u"\u2018", "'")
Inoltre, cosa stai usando per scrivere il file? f1.read ()
dovrebbe restituire una stringa simile a questa:
'I don\xe2\x80\x98t like this'
Se restituisce questa stringa, il file viene scritto in modo errato:
'I don\u2018t like this'
È anche possibile leggere un file di testo codificato usando il metodo di lettura di Python 3:
f = open (file.txt, 'r', encoding='utf-8')
text = f.read()
f.close()
Con questa variante, non è necessario importare librerie aggiuntive