IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

import csv dans une base mysql


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    téléconseiller
    Inscrit en
    Octobre 2018
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : téléconseiller
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2018
    Messages : 36
    Par défaut import csv dans une base mysql
    Bonjour,

    Je bloque sur un script pour que je puisse insérer mon fichier csv dans une base mysql.
    Je ne comprends pas comment inserer row en base.
    Mon code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import csv
    import pymysql
     
    mydb = pymysql.connect(host='localhost',
        user='root',
        passwd='',
        db='data')
    cursor = mydb.cursor()
     
    insert_stmt = (
      "INSERT INTO test (a, b) "
      "VALUES (%s, %s)"
    )
     
    file=open("C:\\Users\\Mathilde\\Desktop\\importcsv_mysql\\test.csv","r")
    test=csv.reader(file)
    for row in test:
           data = (1,2)
           cursor.execute(insert_stmt, row)
     
     
     
    mydb.commit()
    cursor.close()
    Alors que si je fais un cursor.execute(insert_stmt, data) il me rajoutera bien 1,2 pour chaques ligne du fichier.

    Merci !

    Mathilde

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 740
    Par défaut
    Salut,

    Si çà fonctionne avec "data", çà devrait fonctionner avec "row" pour autant que "row" ressemble à "data".

    Que contient "row"?
    Y a t-il un message d'erreur?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Femme Profil pro
    téléconseiller
    Inscrit en
    Octobre 2018
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : téléconseiller
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2018
    Messages : 36
    Par défaut
    j'ai ce message d'erreur

    File "C:\Users\Mathilde\Desktop\importcsv_mysql\import-csv-to-mysql2.py", line 21, in <module>
    cursor.execute(insert_stmt, row)
    File "C:\Users\Mathilde\AppData\Local\Programs\Python\Python38\lib\site-packages\pymysql\cursors.py", line 161, in execute
    query = self.mogrify(query, args)
    File "C:\Users\Mathilde\AppData\Local\Programs\Python\Python38\lib\site-packages\pymysql\cursors.py", line 140, in mogrify
    query = query % self._escape_args(args, conn)
    TypeError: not enough arguments for format string
    J'ai l'impression que je n'exploite par correctement row
    si je fais un print (row) :
    ['a;b']
    ['20170111133701.pdf;1']
    ['20170111122113.pdf;1']
    ['20170111122130.pdf;2']
    ['FDMerged__20170111122303.pdf;47']
    ['20170111122529.pdf;1']
    ['FDMerged__20170111135241.pdf;47']
    ['FDMerged__20170111135530.pdf;51']
    ['20170111135806.pdf;1']

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par titlde26 Voir le message
    si je fais un print (row) :
    Ben voilà. row est une liste contenant une valeur de type string, et non un tuple contenant deux valeurs de type int. Alors la différence liste/tuple est négligeable mais la différence "un string"/"deux int" est bien plus importante. Tu ne peux donc pas te prévaloir du fait que ça fonctionne avec "data" pour te plaindre que cela ne fonctionne pas avec "row".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Femme Profil pro
    téléconseiller
    Inscrit en
    Octobre 2018
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : téléconseiller
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2018
    Messages : 36
    Par défaut
    Je dois donc chercher à convertir mon row ?
    c'est à dire séparer les deux valeur et les encapsuler dans des ""

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par titlde26 Voir le message
    c'est à dire séparer les deux valeur et les encapsuler dans des ""
    Pas des "", des ''. sql est très pointilleux là dessus. Ceci dit c'est pas vraiment compliqué vu que ça se fait à l'insert, te suffit de définir insert_stmt ainsi: insert_stmt="INSERT INTO test (a, b) VALUES ('%s', '%s')".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 740
    Par défaut
    Salut,

    Citation Envoyé par titlde26 Voir le message
    J'ai l'impression que je n'exploite par correctement row
    Ce que vous n'exploitez pas correctement, c'est le module CSV: il devrait fabriquer un row avec 2 éléments alors que là il retourne la ligne sans l'avoir découpée.

    A vous de préciser que pour ce fichier là, les colonnes sont séparées par ';' plutôt que celui qu'il utilise par défaut.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par titlde26 Voir le message
    Alors que si je fais un cursor.execute(insert_stmt, data) il me rajoutera bien 1,2 pour chaques ligne du fichier.
    data est un tuple contenant 2 valeurs. Est-ce que "row" est lui-aussi un tuple contenant deux valeurs ?

    Et si c'est le cas, les valeurs de "data" sont déjà formatées pour entrer telles quelles dans une bdd. En effet, quand on insère un numérique dans une bdd, exemple 5, on écrit insert into table values (5). Si maintenant on veut insérer une string, exemple"hello", on écrit insert into table values ('hello') avec des quotes simples. Si les valeurs de "row" sont des strings, sont-elles encadrées de quotes simples lors de l'insertion ?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/03/2017, 03h56
  2. [Shell] import CSV dans une base de données.
    Par AngeDéchu dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 18/01/2012, 21h14
  3. Réponses: 3
    Dernier message: 07/06/2011, 14h50
  4. [SQL-Server] importer csv dans une base de sql server avec php
    Par berroudji dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/06/2010, 09h23
  5. importer CSV dans une base
    Par altair8080 dans le forum Ruby on Rails
    Réponses: 8
    Dernier message: 20/09/2009, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo