Estoy intentando insertar datos de un diccionario en una base de datos. Quiero iterar sobre los valores y formatearlos en consecuencia, dependiendo del tipo de datos. Aquí hay un fragmento del código que estoy usando:
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 algoritmo con algunos datos de muestra (ver más abajo), aparece el error:
TypeError: elemento de secuencia 0: cadena esperada, int encontrado
Un ejemplo de datos de 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?
values = ",".join(map(str, value_list))
Respuestas:
string.join
conecta elementos dentro de la lista de cadenas, no ints.Utilice esta expresión generadora en su lugar:
fuente
.join(map(str, value_list))
Aunque las respuestas de la lista de comprensión / expresión del generador están bien, me parece más fácil de leer y entender:
fuente
Reemplazar
con
O
fuente
values = ','.join(str(value_list)[1:-1])
[
,]
de su segundo ejemplo, no se requiere una comprensión de la lista y al eliminarlos tiene un generador que es más eficiente.str.join()
método es más rápido ...Las respuestas de cval y Priyank Patel funcionan muy bien. Sin embargo, tenga en cuenta que algunos valores pueden ser cadenas unicode y, por lo tanto, pueden provocar
str
unUnicodeEncodeError
error. En ese caso, reemplace la funciónstr
por la funciónunicode
.Por ejemplo, suponga la cadena Libië (holandés para Libia), representada en Python como la cadena unicode
u'Libi\xeb'
:arroja el siguiente error:
La siguiente línea, sin embargo, no arrojará un error:
Entonces, reemplace:
por
para estar seguro.
fuente
str('\xeb')
=>ë
La interpolación de cadenas es una buena manera de pasar una cadena formateada.
values = ', '.join('$%s' % v for v in value_list)
fuente
puede convertir el marco de datos entero en cadena primero y luego realizar la operación, por ejemplo
fuente