Ich versuche, Daten aus einem Wörterbuch in eine Datenbank einzufügen. Ich möchte die Werte durchlaufen und sie je nach Datentyp entsprechend formatieren. Hier ist ein Ausschnitt des Codes, den ich verwende:
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
Wenn ich das Algo mit einigen Beispieldaten ausführe (siehe unten), wird folgende Fehlermeldung angezeigt:
TypeError: Sequenzelement 0: erwartete Zeichenfolge, int gefunden
Ein Beispiel für Wertelistendaten, die den obigen Fehler ergeben, ist:
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]
Was mache ich falsch?
values = ",".join(map(str, value_list))
Antworten:
string.join
Verbindet Elemente innerhalb der Liste der Zeichenfolgen, nicht Ints.Verwenden Sie stattdessen diesen Generatorausdruck:
quelle
.join(map(str, value_list))
Obwohl die angegebenen Antworten zum Listenverständnis / Generatorausdruck in Ordnung sind, finde ich dies leichter zu lesen und zu verstehen:
quelle
Ersetzen
mit
ODER
quelle
values = ','.join(str(value_list)[1:-1])
[
,]
aus dem zweiten Beispiel eine Liste Verständnis nicht erforderlich ist und von ihnen entfernt haben Sie einen Generator, die effizienter ist.str.join()
MethodeDie Antworten von cval und Priyank Patel funktionieren hervorragend. Beachten Sie jedoch, dass einige Werte Unicode-Zeichenfolgen sein können und daher
str
einenUnicodeEncodeError
Fehler auslösen können . Ersetzen Sie in diesem Fall die Funktionstr
durch die Funktionunicode
.Angenommen, die Zeichenfolge Libië (niederländisch für Libyen), die in Python als Unicode-Zeichenfolge dargestellt wird
u'Libi\xeb'
:löst folgenden Fehler aus:
Die folgende Zeile gibt jedoch keinen Fehler aus:
Also ersetzen:
durch
sicher sein.
quelle
str('\xeb')
=>ë
Die String-Interpolation ist eine gute Möglichkeit, einen formatierten String zu übergeben.
values = ', '.join('$%s' % v for v in value_list)
quelle
Sie können den ganzzahligen Datenrahmen zuerst in einen String konvertieren und dann die Operation ausführen, z
quelle