6 votos

arcpy - error de codificación ascii al actualizar el contenido del campo en la tabla de SQL Server

Sé que hay un montón de posts de blogs y explicaciones acerca de unicode errores, pero todavía no puedo averiguar para manejarlo en mi caso en particular. Así que aquí está mi problema: estoy escribiendo una secuencia de comandos de Python para actualizar registros en una tabla de SQL Server, con el contenido de los campos de un archivo de forma que ha sido editado en ArcPad.

Yo uso un arcpy.da.UpdateCursor a actualizar los registros existentes.

He puesto # -*- coding: cp1252 -*- en la parte superior de mi guión, como yo trabajo con el francés caracteres. Acabo de hacerlo, me sale la codificación ascii de error:

'ascii' codec no se puede codificar los caracteres en la posición 0-1: ordinal no en rango(128)

He intentado poner u antes de que el contenido del campo:

...
with arcpy.da.UpdateCursor(DBtable, DBFields, where_clause) as DBCur:
    for DBrow in DBCur:
        ...
        DBrow[8] = u"{} - {}: {}".format(DBrow[8], date , AProw[8]) # AProw comes from a SearchCursor reading the shapefile.

Puedo, a continuación, imprimir un mensaje con el contenido del texto, y no devuelve un mensaje de error, pero todos los personajes son reemplazados (me da algo como ???4???5????????>???5??? en mi campo de base de datos).

Cualquier acentuada o signo de puntuación puede estar presente en los campos (hay un comentario de texto de campo), por lo que no desea comprobar para cada posible falta de caracteres ascii y reemplazarlo. Yo trabajo con ArcGIS 10.2.2, el shapefile es editado en ArcPad 10.2 y la base de datos es SQL Server 2008 R2.

Lo que me estoy perdiendo? Gracias por la ayuda.

EDIT: Esto sólo se produce si el destino de la base de datos es SQL Server. No hay problema con un archivo gdb. Tengo que añadir que la tabla de SQL Server ya no contiene caracteres ascii.

4voto

Spyros Puntos 56

Finalmente he encontrado una solución al reunir todos de los siguientes cambios en mi código:

  • uso arcpy.ArcSDESQLExecute() en lugar de arcpy.da Insert/Update cursors actualizar/rellenar la tabla (tuve que hacer ambas operaciones y ambos tipos de cursores en realidad no funciona en todas las situaciones).

  • uso # -*- coding:utf8 -*- en el comienzo de la secuencia de comandos, que se supone para ser una buena práctica, de todos modos (# -*- coding: cp1252 -*- me permite tener acentos en los mensajes, pero no funciona para la edición de la tabla de base de datos). Ahora los acentos en mis mensajes son reemplazados, pero la edición de mi base de datos de obras.

  • también hubo un problema con las comillas simples de ser reconocido como delimitadores de cadena dentro de mi petición SQL. Para lidiar con este he tenido que cambiar de ellos con doble comillas simples.

Así que ahora mi código es este:

new_comment  = "{} - {}: {}".format(DBrow[8].replace("'", "''").encode('utf-8'), date , AProw[8]replace("'", "''").encode('utf-8')) 
# DBrow[8] is the comment already present in the table and AProw[8] is the new comment from my shapefile edited in ArcPad
...
sde_conn = arcpy.SDESQLExecute(DB)
sql = '''
update {} set {} = '{}'
'''.format(DBtable, DBcomment_field, new_comment)

Espero que algún día podría ayudar a cualquier persona de la reunión de este tipo de unicode/SQL Server dolor de cabeza.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X