Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lecture fichier txt dans base de donnees sqlite3

Le cauchemar commence!

Sujet résolu
    29 novembre 2011 à 20:54:40

    Bonsoir,

    Je me lance dans le monde python et souhaite créer une interface pour dialoguer avec une base sqlite3.
    Je souhaite lire un fichier txt (1 colonne pour le moment) contenant des noms et créer une table a partir de ce fichier.

    Voici mon code:
    import sqlite3
    file=('D:/Python/eclecture.db')
    conn=sqlite3.connect(file)
    c=conn.cursor()
    try:
        c.execute('drop table captains')
    except sqlite3.OperationalError:
        pass
    c.execute('create table captains(name varchar(30) primary key)')
    fichier=open('D:/Python/cdb.txt',encoding='utf-8')
    c.execute('begin transaction')
    for line in fichier:
        net=line.strip('\n') #supprime les retours a la ligne
        c.execute('insert into captains(name) values(?)',net)
    conn.commit()
    c.close()
    conn.close()
    

    Et l'erreur renvoyée:

    sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 3 supplied.
    File "c:\Users\Xav\Desktop\Projets Python\eclecture.py", line 14, in <module>
      c.execute('insert into captains(name) values(?)',net)


    Une idée?
    Mon code est-il truffé de fautes?
    Je suis un peu a court d’idées.... :'(
    • Partager sur Facebook
    • Partager sur Twitter
      30 novembre 2011 à 0:26:26

      Bonsoir,

      c.execute('insert into captains(name) values(?)',net)
      


      execute() attend en fait une séquence (au cas ou tu n'es pas encore bien familier avec ce terme, sait-on jamais, liste, tuple, chaine de caractères sont des séquences).
      Tu lui donnes une chaine de caractères.
      =>
      Au lieu de prendre la totalité de la chaine comme une seule valeur, execute va croire que chaque caractere de la chaine est une valeur différente (ex values(p,i,e,r,r,e)). Et dans ce cas, ça râle.

      Solution : passer à execute une séquence qui ne contient que la chaine de caractère :
      c.execute('insert into captains(name) values(?)', (net,))
      
      • Partager sur Facebook
      • Partager sur Twitter
        30 novembre 2011 à 8:41:48

        Merci beaucoup Grinwik, j'ai appris quelque chose :p (comme souvent!)
        • Partager sur Facebook
        • Partager sur Twitter
          30 novembre 2011 à 10:27:20

          Cela ne te dispense pas d'éditer ton premier post pour y insérer les balises de code.

          Étant donné que tu es nouveau sur ce forum, je m'en suis occupé à ta place pour cette fois, mais la prochaine fois que tu ignoreras le message d'un modérateur ton sujet sera fermé.
          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !

          Lecture fichier txt dans base de donnees sqlite3

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown