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?


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)

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))

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])

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.


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)


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)))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.