open - Leyendo correctamente el texto de Windows-1252(cp1252) en python
unicode escape python (2)
así que bien, ya que el título sugiere que el problema que tengo es con leer correctamente la entrada de un archivo codificado de windows-1252 en python e insertar dicha entrada en la tabla SQLAlchemy-MySql.
La configuración actual del sistema:
Windows 7 VM con "Roger Access Control System" que genera el archivo;
Ubuntu 12.04 LTS VM con una carpeta compartida en el sistema de Windows para que pueda acceder al archivo utilizando "Python 2.7.3".
Ahora para el problema real, para el archivo de entrada tengo una "carpeta compartida de VM" que contiene un archivo que se genera en un sistema Windows 7 a través del Sistema de Control de Acceso Roger (roger.pl para más detalles), este archivo se llama " PREvents.csv "que sugiere a sus contenidos, un"; " Lista separada de los datos.
Un formato de ejemplo de los datos:
2013-03-19;15:58:30;100;Jānis;Dumburs;1;Uznemums1;0;Ieeja;
2013-03-19;15:58:40;100;Jānis;Dumburs;1;Uznemums1;2;Izeja;
El cuarto campo contiene el nombre del propietario de la tarjeta y el quinto contiene el apellido del propietario, el sexto contiene el grupo asignado por el propietario.
El problema proviene del hecho de que cualquiera de los 3 campos mencionados arriba pueden contener caracteres específicos del idioma letón, en el archivo de ejemplo la palabra "Jānis" contiene la letra "ā" que en unicode es 257.
Como estoy acostumbrado, abro el archivo como tal:
try:
f = codecs.open(file, ''rb'', ''cp1252'')
except IOError:
f = codecs.open(file, ''wb'', ''cp1252'')
Hasta ahora, todo funciona: abre el archivo y, por lo tanto, paso a iterar sobre cada línea del archivo (este es un script de ejecución continua, así que perdón por el bucle):
while True:
line = f.readline()
if not line:
# Pause loop for 1 second
time.sleep(1)
else:
# Split the line into list
date, timed, userid, firstname, lastname, groupid, groupname, typed, pointname, empty = line.split('';'')
Y aquí es donde comienzan los problemas. Si u''J/xe2nis''
print repr(firstname)
se imprime u''J/xe2nis''
que, en la medida en que lo entiendo, no es correcto: `/ xe2 / no representa el carácter letón" ā ".
Más abajo en el bucle, dependiendo del tipo de evento, asigno las variables al objeto SQLAlchemy e inserto / actualizo:
if typed == ''0'': # Entry type
event = Events(
period,
fullname,
userid,
groupname,
timestamp,
0,
0
)
session.add(event)
else: # Exit type
event = session.query(Events).filter(
Events.period == period,
Events.exit == 0,
Events.userid == userid
).first()
if event is not None:
event.exit = timestamp
event.spent = timestamp - event.entry
# Commit changes to database
session.commit()
En mi búsqueda de respuestas, he encontrado cómo definir la codificación predeterminada para usar:
import sys
reload(sys)
sys.setdefaultencoding(''utf-8'')
Lo que no me ha ayudado de ninguna manera.
Básicamente, esto es todo lo que lleva a que yo no pueda insertar los propietarios correctos. El nombre y apellido, así como el nombre del grupo asignado a los propietarios, si contienen alguno de los caracteres específicos de Letonia, por ejemplo:
Instead of the character "ā" it inserts "â"
También me gustaría agregar que no puedo cambiar la codificación del archivo "PREvents.csv" y que el sistema "RACS" no admite la inserción en archivos UTF-8 o Unicode. Si lo intenta, el sistema inserta símbolos aleatorios para el archivo. Caracteres específicos de Letonia.
Déjeme por favor ahora si se necesita cualquier otra información, con gusto la proporcionaré :)
Cualquier ayuda sería muy apreciada.
CP1252 no puede representar a; su entrada contiene el carácter similar â. repr
simplemente muestra una representación ASCII de una cadena Unicode en Python 2.x:
>>> print(repr(b''J/xe2nis''.decode(''cp1252'')))
u''J/xe2nis''
>>> print(b''J/xe2nis''.decode(''cp1252''))
Jânis
Creo que u''J/xe2nis''
es correcto, ver:
>>> print u''J/xe2nis''.encode(''utf-8'')
Jânis
¿Está recibiendo errores reales de SQLAlchemy o en la salida de su aplicación?