txt - Lectura de caracteres del archivo en Python
leer el contenido de un archivo en python (7)
En un archivo de texto, hay una cadena "No me gusta esto".
Sin embargo, cuando lo leo en una cadena, se convierte en "I don / xe2 / x80 / x98t like this". Entiendo que / u2018 es la representación unicode de "''". yo suelo
f1 = open (file1, "r")
text = f1.read()
comando para hacer la lectura
Ahora, ¿es posible leer la cadena de tal manera que cuando se lee en la cadena, es "No me gusta esto", en lugar de "No me gusta / xe2 / x80 / x98t como este"?
Segunda edición: he visto que algunas personas usan el mapeo para resolver este problema, pero realmente, ¿no hay una conversión incorporada que haga este tipo de conversión de ANSI a Unicode (y viceversa)?
Dejando de lado el hecho de que su archivo de texto está roto (U + 2018 es una comilla izquierda, no un apóstrofo): iconv puede usarse para transcribir los caracteres unicode en ascii.
Tendrás que buscar google para "iconvcodec", ya que el módulo parece no ser compatible más y no puedo encontrar una página de inicio canónica para él.
>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '''')
>>> u''/u2018''.encode(''ascii//translit'')
"''"
Alternativamente, puede usar la utilidad de línea de comandos iconv
para limpiar su archivo:
$ xxd foo
0000000: e280 980a ....
$ iconv -t ''ascii//translit'' foo | xxd
0000000: 270a ''.
En realidad, U + 2018 es la representación Unicode del carácter especial ''. Si lo desea, puede convertir instancias de ese carácter a U + 0027 con este código:
text = text.replace (u"/u2018", "''")
Además, ¿qué estás usando para escribir el archivo? f1.read()
debería devolver una cadena que se parece a esto:
''I don/xe2/x80/x98t like this''
Si devuelve esta cadena, el archivo se escribe incorrectamente:
''I don/u2018t like this''
Esta es la manera de pitones que te muestran cadenas codificadas unicode. Pero creo que debería poder imprimir la cadena en la pantalla o escribirla en un nuevo archivo sin ningún problema.
>>> test = u"I don/u2018t like this"
>>> test
u''I don/u2018t like this''
>>> print test
I don‘t like this
Existe la posibilidad de que de alguna manera tenga una cadena no unicode con caracteres de escape Unicode, por ejemplo:
>>> print repr(text)
''I don//u2018t like this''
Esto realmente me pasó una vez antes. Puede usar un códec unicode_escape
para decodificar la cadena para unicode y luego codificarla en cualquier formato que desee:
>>> uni = text.decode(''unicode_escape'')
>>> print type(uni)
<type ''unicode''>
>>> print uni.encode(''utf-8'')
I don‘t like this
Hay algunos puntos a considerar.
Un carácter / u2018 puede aparecer solo como un fragmento de representación de una cadena Unicode en Python, por ejemplo, si escribe:
>>> text = u''‘''
>>> print repr(text)
u''/u2018''
Ahora bien, si simplemente desea imprimir la cadena Unicode muy bien, simplemente use el método de encode
de Unicode:
>>> text = u''I don/u2018t like this''
>>> print text.encode(''utf-8'')
I don‘t like this
Para asegurarse de que cada línea de cualquier archivo se lea como unicode, será mejor que use la función codecs.open
lugar de simplemente open
, lo que le permite especificar la codificación del archivo:
>>> 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
Pero realmente es "No me gusta esto" y no "No me gusta esto". El carácter u ''/ u2018'' es un personaje completamente diferente de '''' '''' (y, visualmente, debería corresponder más a '''' '').
Si está tratando de convertir unicode codificado en ASCII simple, quizás pueda mantener un mapeo de puntuación unicode que le gustaría traducir a ASCII.
punctuation = {
u''/u2018'': "''",
u''/u2019'': "''",
}
for src, dest in punctuation.iteritems():
text = text.replace(src, dest)
Sin embargo, hay una gran cantidad de caracteres de puntuación en Unicode , pero supongo que puede contar con que solo algunos de ellos sean utilizados por la aplicación que está creando los documentos que está leyendo.
Ref: http://docs.python.org/howto/unicode
Por lo tanto, la lectura de Unicode desde un archivo es simple:
import codecs
f = codecs.open(''unicode.rst'', encoding=''utf-8'')
for line in f:
print repr(line)
También es posible abrir archivos en modo de actualización, lo que permite leer y escribir:
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()
EDITAR : supongo que su objetivo previsto es simplemente poder leer el archivo correctamente en una cadena en Python. Si está intentando convertir una cadena ASCII de Unicode, entonces realmente no hay una manera directa de hacerlo, ya que los caracteres Unicode no necesariamente existirán en ASCII.
Si intenta convertir a una cadena ASCII, intente uno de los siguientes:
Reemplace los caracteres Unicode específicos con equivalentes ASCII, si solo está tratando de manejar algunos casos especiales, como este ejemplo en particular
Use el
unicodedata
normalize()
del módulounicodedata
y el métodostring.encode()
para convertir lo mejor que pueda al siguiente equivalente ASCII más cercano (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''