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)?

È stato utile?

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:

  1. Sostituisci i caratteri Unicode specifici con equivalenti ASCII, se stai solo cercando di gestire alcuni casi speciali come questo esempio particolare

  2. Utilizza il metodo unicodedata normalize () e il metodo string.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

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