python - vettori - simbolo diverso in flowgorithm




Come posso convertire il formato di un file da Unicode a ASCII usando Python? (6)

È importante notare che non esiste un formato di file "Unicode". Unicode può essere codificato in byte in diversi modi. Più comunemente UTF-8 o UTF-16. Dovrai sapere qual è il tuo strumento di terze parti in uscita. Una volta che lo sai, la conversione tra diverse codifiche è abbastanza semplice:

in_file = open("myfile.txt", "rb")
out_file = open("mynewfile.txt", "wb")

in_byte_string = in_file.read()
unicode_string = bytestring.decode('UTF-16')
out_byte_string = unicode_string.encode('ASCII')

out_file.write(out_byte_string)
out_file.close()

Come notato nelle altre risposte, probabilmente vorrai fornire un gestore di errori al metodo di codifica. Usare 'replace' come gestore di errori è semplice, ma mangerà il tuo testo se contiene caratteri che non possono essere rappresentati in ASCII.

Uso uno strumento di terze parti che emette un file in formato Unicode. Tuttavia, preferisco che sia in ASCII. Lo strumento non ha impostazioni per modificare il formato del file.

Qual è il modo migliore per convertire l'intero formato di file usando Python?


A proposito, si tratta di un comando linux iconv per fare questo tipo di lavoro.

iconv -f utf8 -t ascii <input.txt >output.txt

Come questo:

uc = open(filename).read().decode('utf8')
ascii = uc.decode('ascii')

Notare, tuttavia, che ciò non riuscirà con un'eccezione UnicodeDecodeError se vi sono caratteri che non possono essere convertiti in ASCII.

EDIT: Come appena sottolineato da Pete Karl, non esiste un mapping uno a uno da Unicode a ASCII. Quindi alcuni personaggi semplicemente non possono essere convertiti in un modo che preserva l'informazione. Inoltre, l'ASCII standard è più o meno un sottoinsieme di UTF-8, quindi non è nemmeno necessario eseguire alcuna decodifica.


Ecco un codice semplice (e stupido) per eseguire la traduzione di codifica. Suppongo (ma non dovresti) che il file di input sia in UTF-16 (Windows lo chiama semplicemente 'Unicode').

input_codec = 'UTF-16'
output_codec = 'ASCII'

unicode_file = open('filename')
unicode_data = unicode_file.read().decode(input_codec)
ascii_file = open('new filename', 'w')
ascii_file.write(unicode_data.write(unicode_data.encode(output_codec)))

Nota che questo non funzionerà se nel file Unicode ci sono caratteri che non sono anche caratteri ASCII. Puoi fare quanto segue per trasformare i caratteri non riconosciuti in "?":

ascii_file.write(unicode_data.write(unicode_data.encode(output_codec, 'replace')))

Dai un'occhiata ai documenti per scelte più semplici. Se hai bisogno di fare qualcosa di più sofisticato, ti consigliamo di dare un'occhiata a UNICODE Hammer al Python Cookbook.


Penso che questo sia un problema più profondo di quanto tu non creda . Cambiare semplicemente il file da Unicode in ASCII è facile, tuttavia, ottenere tutti i caratteri Unicode da tradurre in equivalenti ASCII ragionevoli (molte lettere non sono disponibili in entrambe le codifiche) è un altro.

Questo tutorial su Python Unicode può darti un'idea migliore di ciò che accade alle stringhe Unicode tradotte in ASCII: http://www.reportlab.com/i18n/python_unicode_tutorial.html

Ecco una citazione utile dal sito:

Python 1.6 ha anche una funzione integrata "unicode", alla quale è possibile specificare la codifica:

> >>> unicode('hello') u'hello'
> >>> unicode('hello', 'ascii') u'hello'
> >>> unicode('hello', 'iso-8859-1') u'hello'
> >>>

Tutti e tre di questi restituiscono la stessa cosa, poiché i caratteri in "Hello" sono comuni a tutte e tre le codifiche.

Ora codifichiamo qualcosa con un accento europeo, che è al di fuori di ASCII. Quello che vedi su una console può dipendere dalle impostazioni locali del tuo sistema operativo; Windows mi consente di digitare ISO-Latin-1.

> >>> a = unicode('André','latin-1')
> >>> a u'Andr\202'

Se non è possibile digitare una lettera acuta e, è possibile inserire la stringa "Andr \ 202", che non è ambigua.

Unicode supporta tutte le operazioni comuni come l'iterazione e la divisione. Non li investiremo qui.


Puoi convertire il file abbastanza facilmente usando la funzione unicode , ma ti imbatterai in problemi con i caratteri Unicode senza un equivalente ASCII dritto.

Questo blog raccomanda il modulo unicodedata , che sembra occuparsi della conversione approssimativa dei caratteri senza i corrispondenti valori ASCII corrispondenti, ad es

>>> title = u"Klüft skräms inför på fédéral électoral große"

viene in genere convertito in

Klft skrms infr p fdral lectoral groe

che è abbastanza sbagliato. Tuttavia, usando il modulo unicodedata , il risultato può essere molto più vicino al testo originale:

>>> import unicodedata
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'




ascii