TypeError: item urutan 0: string yang diharapkan, int ditemukan

188

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?

Homunculus Reticulli
sumber
42
soulution untuk Anda:values = ",".join(map(str, value_list))
ddzialak

Jawaban:

384

string.join menghubungkan elemen di dalam daftar string, bukan int.

Gunakan ekspresi generator ini sebagai gantinya:

values = ','.join(str(v) for v in value_list)
cval
sumber
32
Dapat juga menggunakan.join(map(str, value_list))
BallpointBen
44

Meskipun jawaban daftar pemahaman / generator ekspresi yang diberikan ok, saya menemukan ini lebih mudah dibaca dan dipahami:

values = ','.join(map(str, value_list))
Kirpit
sumber
2
Senang ini menggunakan peta dan str. Saya akan menggunakan pola ini untuk maju :)
Timothy C. Quinn
17

Menggantikan

values = ",".join(value_list)

dengan

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

ATAU

values = ','.join(str(value_list)[1:-1])
Priyank Patel
sumber
1
Satu lagi values = ','.join(str(value_list)[1:-1])
Priyank Patel
4
hapus [, ]dari contoh kedua Anda, pemahaman daftar tidak diperlukan dan dengan menghapusnya Anda memiliki generator yang lebih efisien.
jamylak
3
Sebenarnya, seperti yang dijelaskan di stackoverflow.com/questions/9060653/… , menggunakan daftar alih-alih generator dalam str.join()metode lebih cepat ...
dtheodor
12

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 strmelempar UnicodeEncodeError. Dalam hal ini, ganti fungsi strdengan fungsi unicode.

Misalnya, asumsikan string Libië (Belanda untuk Libya), direpresentasikan dalam Python sebagai string unicode u'Libi\xeb':

print str(u'Libi\xeb')

melempar kesalahan berikut:

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)

Namun, baris berikut tidak akan membuat kesalahan:

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

Jadi, ganti:

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

oleh

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

agar selamat.

Tomasz Nguyen
sumber
1
Ini solusi terbaik di sini! values ​​= ','. join ([unicode (i) for i in value_list]) yang berfungsi jika Anda memiliki campuran bilangan bulat dan string dengan karakter ascii yang diperluas.
mel
Tidak lagi menjadi masalah di Python3, str('\xeb')=>ë
Brayoni
0

Interpolasi string adalah cara yang bagus untuk meneruskan string yang diformat.

values = ', '.join('$%s' % v for v in value_list)

Port Edison
sumber
0

Anda dapat mengonversi integer dataframe menjadi string terlebih dahulu dan kemudian melakukan operasi mis

df3['nID']=df3['nID'].astype(str)
grp = df3.groupby('userID')['nID'].aggregate(lambda x: '->'.join(tuple(x)))
Shaina Raza
sumber