273 votes

TypeError : élément de séquence 0 : attendu string, int trouvé

Je tente d'insérer des données d'un dictionnaire dans une base de données. Je veux itérer sur les valeurs et les formater en conséquence, en fonction du type de données. Voici un extrait du code que j'utilise :

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

Lorsque j'exécute l'algo en utilisant un échantillon de données (voir ci-dessous), j'obtiens l'erreur suivante :

TypeError : élément de séquence 0 : attendu string, int trouvé

Voici un exemple de données de type value_list qui donne l'erreur ci-dessus :

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] 

Qu'est-ce que je fais de mal ?

68 votes

Soulution pour vous : values = ",".join(map(str, value_list))

526voto

cval Points 1218

string.join relie les éléments d'une liste de chaînes de caractères, pas d'ints.

Utilisez cette expression de générateur à la place :

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

65 votes

Peut également utiliser .join(map(str, value_list))

77voto

kirpit Points 836

Bien que les réponses données pour la compréhension de la liste et l'expression du générateur soient correctes, je trouve que cette version est plus facile à lire et à comprendre :

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

22voto

Priyank Patel Points 1713

Remplacer

values = ",".join(value_list)

avec

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

O

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

1 votes

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

4 votes

Retirer le [ , ] Dans votre deuxième exemple, la compréhension de la liste n'est pas nécessaire et en les supprimant, vous obtenez un générateur plus efficace.

3 votes

En fait, comme expliqué à stackoverflow.com/questions/9060653/ en utilisant une liste au lieu d'un générateur dans le str.join() La méthode est plus rapide...

15voto

Tomasz Nguyen Points 2371

Les réponses de cval y Priyank Patel fonctionnent très bien. Cependant, il faut savoir que certaines valeurs peuvent être des chaînes unicode et donc provoquer l'apparition de l'erreur d'affichage. str pour lancer un UnicodeEncodeError erreur. Dans ce cas, remplacez la fonction str par la fonction unicode .

Par exemple, supposons que la chaîne Libië (Libye en néerlandais), représentée en Python comme la chaîne unicode u'Libi\xeb' :

print str(u'Libi\xeb')

lance l'erreur suivante :

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 ligne suivante, en revanche, n'entraînera pas d'erreur :

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

Alors, remplacez :

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

par

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

pour être en sécurité.

4voto

Port Edison Points 80

L'interpolation de chaînes est un moyen agréable de transmettre une chaîne formatée.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X