TypeError: sıra öğesi 0: beklenen dize, int bulundu


188

Bir veritabanından bir sözlük veri eklemek için çalışıyorum. Değerler üzerinde yineleme yapmak ve veri türüne bağlı olarak bunları biçimlendirmek istiyorum. İşte kullandığım kodun bir parçası:

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

Bazı örnek verileri kullanarak algo çalıştırdığımda (aşağıya bakın), hatayı alıyorum:

TypeError: sıra öğesi 0: beklenen dize, int bulundu

Yukarıdaki hatayı veren bir değer listesi verisi örneği:

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] 

Neyi yanlış yapıyorum?


42
sizin için values = ",".join(map(str, value_list))
ruh

Yanıtlar:


384

string.join ints değil, dize listesinin içindeki öğeleri birbirine bağlar.

Bunun yerine bu jeneratör ifadesini kullanın:

values = ','.join(str(v) for v in value_list)

32
Ayrıca kullanabilir.join(map(str, value_list))
BallpointBen

44

Verilen liste anlama / üreteç ifadesi cevapları iyi olsa da, bunu okumak ve anlamak daha kolay buluyorum:

values = ','.join(map(str, value_list))

2
Bu harita ve str kullanımını seviyorum. Bu modeli ileriye doğru kullanacağım :)
Timothy C. Quinn

17

değiştirmek

values = ",".join(value_list)

ile

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

VEYA

values = ','.join(str(value_list)[1:-1])

1
Başka bir values = ','.join(str(value_list)[1:-1])
Priyank Patel

4
kaldırmak [, ]ikinci örnekten, bir liste anlama gerekli değildir ve bunları kaldırarak daha verimli bir jeneratör var.
jamylak

3
Aslında, stackoverflow.com/questions/9060653/… adresinde açıklandığı gibi , str.join()yöntemde jeneratör yerine bir liste kullanmak daha hızlıdır ...
dtheodor

12

Cval ve Priyank Patel'in cevapları harika çalışıyor. Bununla birlikte, bazı değerlerin unicode dizeleri olabileceğini ve bu nedenle hata strvermesine neden olabileceğini unutmayın UnicodeEncodeError. Bu durumda, işlev yerine strişlev tarafından unicode.

Örneğin, Python'da unicode dize olarak temsil edilen Libië (Libya için Felemenkçe) dizesini varsayalım u'Libi\xeb':

print str(u'Libi\xeb')

aşağıdaki hatayı atar:

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)

Bununla birlikte, aşağıdaki satır bir hata atmayacaktır:

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

Yani, değiştirin:

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

tarafından

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

güvende olmak.


1
Buradaki en iyi çözüm! değerleri (','.
mel

Python3'te artık bir sorun yok, str('\xeb')=>ë
Brayoni

0

Dize enterpolasyonu, biçimlendirilmiş bir dize geçirmenin güzel bir yoludur.

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


0

önce tamsayı veri çerçevesini dizgiye dönüştürebilir ve ardından işlemi ör.

df3['nID']=df3['nID'].astype(str)
grp = df3.groupby('userID')['nID'].aggregate(lambda x: '->'.join(tuple(x)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.