2012-06-04 22 views
84

Estoy intentando insertar datos de un diccionario en una base de datos. Quiero iterar sobre los valores y formatearlos en consecuencia, según el tipo de datos. Aquí hay un fragmento del código que estoy utilizando:TypeError: elemento de secuencia 0: cadena esperada, int found

def _db_inserts(dbinfo): 
    try: 
     rows = dbinfo['datarows'] 

     for row in rows: 
      field_names = ",".join(["'{0}'".format(x) for x in row.keys()]) 
      value_list = row.values() 

      for pos, value in enumerate(value_list): 
       if isinstance(value, str): 
        value_list[pos] = "'{0}'".format(value) 
       elif isinstance(value, datetime): 
        value_list[pos] = "'{0}'".format(value.strftime('%Y-%m-%d')) 

      values = ",".join(value_list) 

      sql = "INSERT INTO table_foobar ({0}) VALUES ({1})".format(field_names, values) 

    except Exception as e: 
     print 'BARFED with msg:',e 

Cuando ejecuto el algo el uso de algunos datos de la muestra (ver más abajo), me sale el error:

TypeError: sequence item 0: expected string, int found

Un ejemplo de datos value_list que da el error anterior es:

value_list = [377, -99999, -99999, 'f', -99999, -99999, -99999, 1108.0999999999999, 0, 'f', -99999, 0, 'f', -99999, 'f', -99999, 1108.0999999999999, -99999, 'f', -99999, 'f', -99999, 'f', 'f', 0, 1108.0999999999999, -99999, -99999, 'f', 'f', 'f', -99999, 'f', '1984-04-02', -99999, 'f', -99999, 'f', 1108.0999999999999] 

¿Qué estoy haciendo mal?

+19

Soulution para usted:. 'Valores = "" unirse (mapa (str, value_list)) ' – ddzialak

Respuesta

200

string.join conecta elementos dentro de la lista de cadenas, no en las entradas.

Uso esta expresión generador en lugar:

values = ','.join(str(v) for v in value_list) 
8

Reemplazar

values = ",".join(value_list) 

con

values = ','.join([str(i) for i in value_list]) 

O

values = ','.join(str(value_list)[1:-1]) 
+0

Otro' values ​​= ','. Join (str (value_list) [1: -1]) ' –

+3

elimina el' [','] 'de su segundo ejemplo, no se requiere una comprensión de la lista y eliminando ellos tienen un generador que es más eficiente. – jamylak

+0

En realidad, como se explica en http: // stackoverflow.com/questions/9060653/list-comprehension-without-python, usar una lista en lugar de generator en el método 'str.join()' es más rápido ... – dtheodor

10

Las respuestas por cval y Priyank Patel funcionan muy bien. Sin embargo, tenga en cuenta que algunos valores podrían ser cadenas unicode y, por lo tanto, pueden provocar que str arroje un error UnicodeEncodeError. En ese caso, reemplace la función str por la función unicode.

Por ejemplo, supongamos que la cadena Libië (holandés para Libia), representada en Python como la cadena Unicode u'Libi\xeb':

print str(u'Libi\xeb') 

lanza el siguiente error:

Traceback (most recent call last): 
    File "/Users/tomasz/Python/MA-CIW-Scriptie/RecreateTweets.py", line 21, in <module> 
    print str(u'Libi\xeb') 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xeb' in position 4: ordinal not in range(128) 

La siguiente línea, sin embargo , no lanzará un error:

print unicode(u'Libi\xeb') # prints Libië 

Entonces, reemplace :

values = ','.join([str(i) for i in value_list]) 

por

values = ','.join([unicode(i) for i in value_list]) 

para estar seguro.

+1

¡Esta es la mejor solución aquí! values ​​= ','. join ([unicode (i) for i en value_list]) que funciona en caso de que tenga una mezcla de enteros y cadenas con caracteres ascii extendidos. – mel

8

aunque la lista dada de expresión de comprensión/generador de respuestas están bien, Me parece más fácil de leer y comprender:

values = ','.join(map(str, value_list)) 
Cuestiones relacionadas