Saya mencoba memasukkan data dari kamus ke dalam basis data. Saya ingin beralih pada nilai dan memformatnya, tergantung pada tipe data. Berikut ini cuplikan dari kode yang saya gunakan:
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
Ketika saya menjalankan algo menggunakan beberapa data sampel (lihat di bawah), saya mendapatkan kesalahan:
TypeError: item urutan 0: string yang diharapkan, int ditemukan
Contoh data value_list yang memberikan kesalahan di atas adalah:
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]
Apa yang saya lakukan salah?
values = ",".join(map(str, value_list))
Jawaban:
string.join
menghubungkan elemen di dalam daftar string, bukan int.Gunakan ekspresi generator ini sebagai gantinya:
sumber
.join(map(str, value_list))
Meskipun jawaban daftar pemahaman / generator ekspresi yang diberikan ok, saya menemukan ini lebih mudah dibaca dan dipahami:
sumber
Menggantikan
dengan
ATAU
sumber
values = ','.join(str(value_list)[1:-1])
[
,]
dari contoh kedua Anda, pemahaman daftar tidak diperlukan dan dengan menghapusnya Anda memiliki generator yang lebih efisien.str.join()
metode lebih cepat ...Jawaban oleh cval dan Priyank Patel bekerja dengan baik. Namun, perlu diketahui bahwa beberapa nilai bisa berupa string unicode dan karena itu dapat menyebabkan kesalahan
str
melemparUnicodeEncodeError
. Dalam hal ini, ganti fungsistr
dengan fungsiunicode
.Misalnya, asumsikan string Libië (Belanda untuk Libya), direpresentasikan dalam Python sebagai string unicode
u'Libi\xeb'
:melempar kesalahan berikut:
Namun, baris berikut tidak akan membuat kesalahan:
Jadi, ganti:
oleh
agar selamat.
sumber
str('\xeb')
=>ë
Interpolasi string adalah cara yang bagus untuk meneruskan string yang diformat.
values = ', '.join('$%s' % v for v in value_list)
sumber
Anda dapat mengonversi integer dataframe menjadi string terlebih dahulu dan kemudian melakukan operasi mis
sumber