Problema de encoding de Python

Tengo una escritura del python que exporte datos de una tabla de utf-8 de mysql en un textfile. Aquí está el código que hace el trabajo

csvDatei = codecs.open( csvDateiName, "w", "utf-8" ) ... cursor = db.cursor(); sql = "select * from %s.%s;" % (dbAusgang, tabelle) cursor.execute(sql); ... daten = cursor.fetchall(); for i in xrange(len(daten)): line = ''; for j in xrange(len(daten[i])): line += '"%s";' % unicode(daten[i][j]); line = line[:-1]; line += '\n'; csvDatei.write(line); csvDatei.close(); 

También he intentado esto

 line += '"%s";' % str(daten[i][j]); 

y

 line += '"%s";' % daten[i][j]; 

Y ahora la parte que no entiendo:

Normalmente, este script debe ser invocado por un trabajo cron. Pero cuando leo un varchar de una tabla que contiene una diéresis como ä, ö o ü el guión simplemente termina. Comprobé que al canalizar la salida de la secuencia de commands en un file.

Por lo tanto he probado el script invocándolo manualmente en el shell simplemente escribiendo "python myscript.py" y funciona perfectamente bien sin ningún problema.

Así que mi conjetura es que el problema no miente realmente en el guión sí mismo sino más bien en el ambiente del cron de alguna manera.

Espero que cualquiera de ustedes pueda darme consejos. Estoy completamente confundido.

Cualquier ayuda es apreciada.

—————- Respuesta al comentario 1:

Gracias por la pista con la configuration regional.

Primero escribí "locale" en el shell estándar. Me dio la siguiente salida:

 dhl@srv1093:~$ locale LANG=de_DE.UTF-8 LC_CTYPE="de_DE.UTF-8" LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_MESSAGES="de_DE.UTF-8" LC_PAPER="de_DE.UTF-8" LC_NAME="de_DE.UTF-8" LC_ADDRESS="de_DE.UTF-8" LC_TELEPHONE="de_DE.UTF-8" LC_MEASUREMENT="de_DE.UTF-8" LC_IDENTIFICATION="de_DE.UTF-8" LC_ALL=de_DE.UTF-8 

Luego edité el file cron con "crontab -e" y agregé la línea siguiente

 */1 * * * * locale > /home/user/locale.ouput 

La salida de este cronjob es:

 dhl@srv1093:~$ cat locale.ouput LANG= LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL= 

Por lo tanto, este podría ser el problema? ¿Cómo puedo arreglar eso?

3 Solutions collect form web for “Problema de encoding de Python”

Usted decodificar las líneas a unicode con unicode(daten[i][j]) . Cuando no da ninguna encoding, entonces Python utiliza el sistema pnetworkingeterminado, que es probablemente ascii cuando se ejecuta el script a través de cron.

De cualquier manera, debe dar la encoding real utilizada por la database. Usted puede usar unicode(daten[i][j], dbencoding) lugar, o get su adaptador de database para darle unicode directamente.

Btw: Probablemente hay un millón de herramientas que generan files cvs desde consultas de bases de datos, MySQL tiene que incluso incorporado. Tu código, por otro lado, es bastante frágil porque no puedes escaping de ninguna manera.

Estoy bastante seguro de que es el problema. MySQL examinará la configuration de la configuration regional para determinar la encoding de caracteres para devolver valores. También sé que los caracteres latinos con umlauts cuando se codifican en ISO-8859-1 no son caracteres UTF-8 válidos y cualquier decodificador fallará si intenta decodificar (y sin una configuration regional, el module cliente db puede estar pnetworkingeterminado). No lo he probado y no sé qué versión de python que está utilizando, pero Googling python locale devuelto este enlace: http://docs.python.org/library/locale.html Así . lo intentaré

 import locale locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8') 

al principio de su secuencia de commands antes de importar su module de conectividad db y ver si funciona.

Bueno, ahora descubrí cuál es el problema. No tiene nada que ver con el código, bien está bien que ya estaba claro antes, pero las variables de idioma local son el problema.

En el trabajo cron las codificaciones se establecen en POSIX y en el modo SHELL normal las codificaciones se establecen en UTF-8. Así que cambié las codificaciones de UTF-8 a POSIX y ejecuté mi script. Y sorprende, el mismo error ocurre como en el entorno de cron. Así que ahora cambio la encoding paso a paso, quiero decir variable por variable y comprobar si mi script se ejecuta o no.

Primero lo cambié

export LANG = de_DE.UTF-8

y ejecutar el script el mismo error se mantuvo. Luego, después de eso, cambié

export LC_CTYPE = "de_DE.UTF-8"

y luego el guión funcionó absolutly bien. No hay problemas.

Así que ese es el problema. Ahora, ¿cómo puedo cambiar esta variable en mi entorno cron? Ya lo intenté en el código

 locale.setlocale(locale.LC_CTYPE, 'de_DE.UTF-8') 

Pero eso no funcionó.

¿Cómo puedo cambiar eso?

  • Copia de files de un server a un set de máquinas
  • printing de usuario de subshell obtención de raíz vía su -
  • Permisos de files Sudoers
  • Cómo ejecutar c ++ y get la salida en un file de logging
  • Script de Shell para crear una connection SSH de background si no existe
  • ¿El command sh usa el shell de usuarios?
  • ¿Cómo dividir la salida en files diferentes?
  • ls -m con más información?
  • Orden de orden predeterminada del comando de búsqueda
  • crontab - ejecutar de inmediato?
  • ¿La mejor manera de manejar $ PATH varibles?
  • Si conozco el número PID de un process, ¿puedo saber su nombre?
  • GPO de Windows "Permitir acceso remoto de shell", donde establecer "Falso" una vez que lo habilitas?
  • El linux y los temas del servidor de Windows, como ubuntu, centos, apache, nginx, debian y consejos de red.