TypeError: elemento sequenza 0: stringa prevista, int trovato


188

Sto tentando di inserire dati da un dizionario in un database. Voglio scorrere i valori e formattarli di conseguenza, a seconda del tipo di dati. Ecco uno snippet del codice che sto usando:

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

Quando eseguo l'algo usando alcuni dati di esempio (vedi sotto), ottengo l'errore:

TypeError: elemento sequenza 0: stringa prevista, int trovato

Un esempio di dati value_list che fornisce l'errore sopra riportato è:

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] 

Che cosa sto facendo di sbagliato?


42
soulution for you:values = ",".join(map(str, value_list))
ddzialak

Risposte:


384

string.join collega gli elementi all'interno dell'elenco di stringhe, non ints.

Utilizzare invece questa espressione del generatore:

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

32
Può anche usare.join(map(str, value_list))
BallpointBen

44

Sebbene le risposte di comprensione / espressione dell'elenco fornite siano corrette, trovo che sia più facile da leggere e comprendere:

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

2
Adoro questo uso di map e str. In futuro userò questo schema :)
Timothy C. Quinn,

17

Sostituire

values = ",".join(value_list)

con

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

O

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

1
Un altro values = ','.join(str(value_list)[1:-1])
Priyank Patel,

4
rimuovi il [, ]dal tuo secondo esempio, non è necessaria una comprensione dell'elenco e rimuovendoli hai un generatore che è più efficiente.
jamylak,

3
In realtà, come spiegato su stackoverflow.com/questions/9060653/… , l'utilizzo di un elenco anziché di un generatore nel str.join()metodo è più veloce ...
dtheodor

12

Le risposte di cval e Priyank Patel funzionano alla grande. Tuttavia, tenere presente che alcuni valori potrebbero essere stringhe unicode e pertanto potrebbero causare strun UnicodeEncodeErrorerrore. In tal caso, sostituire la funzione strcon la funzione unicode.

Ad esempio, supponiamo che la stringa Libië (olandese per la Libia), rappresentata in Python come stringa unicode u'Libi\xeb':

print str(u'Libi\xeb')

genera il seguente errore:

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)

La riga seguente, tuttavia, non genererà un errore:

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

Quindi, sostituisci:

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

di

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

per essere al sicuro.


1
Questa è la soluzione migliore qui! valori = ','. join ([unicode (i) per i in value_list]) che funziona nel caso in cui tu abbia una combinazione di numeri interi e stringhe con caratteri ASCII estesi.
mel

Non è più un problema in Python3, str('\xeb')=>ë
Brayoni il

0

L'interpolazione di stringhe è un buon modo per passare una stringa formattata.

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


0

è possibile convertire prima l'intero frame di dati in stringa e quindi eseguire l'operazione ad es

df3['nID']=df3['nID'].astype(str)
grp = df3.groupby('userID')['nID'].aggregate(lambda x: '->'.join(tuple(x)))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.