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 :

Importer csv dans une table sql via Python


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Importer csv dans une table sql via Python
    bonjour

    je cherche a importer des fichiers csv dans une database sql, via python 3, avec mysql-connector

    je voudrais avoir des noms de colonnes dynamiques dans le code python, mais je n'y parviens pas.

    pour isoler cet effet, voici un exemple qui fonctionne :

    cnx = mysql.connector.connect(user='root', database='ddddd',password='')
    cursor = cnx.cursor()

    add_t=("INSERT INTO table"
    "(col1,col2,col3) "
    "VALUES (%s,%s,%s)")

    a='69'
    b='36'
    c='sfdfs'

    data_t=(a,b,c)

    cursor.execute(add_t,data_t)
    [/COLOR]

    ensuite je souhaite donc que col1, col2, col3 soient des variables, et je pensais faire :

    cnx = mysql.connector.connect(user='root', database='ddddd',password='')
    cursor = cnx.cursor()

    add_t=("INSERT INTO table"
    "(%s,%s,%s) "
    "VALUES (%s,%s,%s)")

    data_c=(col1,col2,col3)

    a='69'
    b='36'
    c='sfdfs'

    data_t=(a,b,c)

    cursor.execute(add_t,data_c+data_t)


    ==> qq'un a t il deja fait qqe chose de similaire (ie avoir a la fois les colonnes et les values dynamiques dans un INSERT a partir de Pyhton ?

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 474
    Points : 9 274
    Points
    9 274
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je fais ça, mais avec Python 2.7 et sqlite3. Mais ici, ce n'est qu'un problème de traitement de chaîne:

    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
    add_t=("INSERT INTO table"
    "(%s,%s,%s) "
    "VALUES (%s,%s,%s)")
     
    col1 = 'nom'
    col2 = 'prenom'
    col3 = 'telephone'
    data_c=(col1,col2,col3)
     
    a='69'
    b='36'
    c='sfdfs'
    data_t=(a,b,c)
     
    chaine = add_t % (data_c+data_t)
    print(chaine)
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table(nom,prenom,telephone) VALUES (69,36,sfdfs)
    Au cas où la syntaxe du pilote mysql demanderait que les valeurs soit entourées par des quotes, on peut les introduire soit dans les valeurs ("'" + 'sfdsf' + "'") soit dans le masque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    add_t=("INSERT INTO table"
    "(%s,%s,%s) "
    "VALUES (%s,%s,'%s')")
    Ce qui donnera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table(nom,prenom,telephone) VALUES (69,36,'sfdfs')
    J'utilise souvent une fonction qui fait ça, mais qui accepte un nombre de colonnes non connu à l'avance: il faut alors construire la ligne des noms de champs et celle des valeurs avec les virgules:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print(','.join(data_c))
    nom,prenom,telephone
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Points : 426
    Points
    426
    Par défaut
    Bonjour,

    Je pense que pour la clause value, le mieux est d'utiliser des bind variables dans la méthode execute, cela permet de s'affranchir de quoter les strings et est plus sécurisé.

    http://docs.python.org/2/library/sql...t=sql%20cursor

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    merci Tyrtamos !

    avec python3 + mysqlconnector, il faut en effet declarer les strings entre quotes '%s'...

    merci beaucoup

    je dois en effet faire que le nombre de colonnes , et de values soit lui meme variable. je n'ai pas bien compris ton example print(','.join(data_c)) ? comment inserer cela dans la chaine de commande sql ?

    merci aussi a Drawingrom. je vais essayer a la prochaine etape.

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 474
    Points : 9 274
    Points
    9 274
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par bacheld2 Voir le message
    je dois en effet faire que le nombre de colonnes , et de values soit lui meme variable. je n'ai pas bien compris ton example print(','.join(data_c)) ? comment inserer cela dans la chaine de commande sql ?
    Voilà comment on peut faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    data_c = ['nom', 'prenom', 'telephone']
    champs = ','.join(data_c)
    print champs
     
    data_t = ['69', '36', "'sfdfs'"]
    valeurs = ','.join(data_t)
    print valeurs
     
    add_t = ("INSERT INTO table"
    "(%s) "
    "VALUES (%s)")
    chaine = add_t % (champs, valeurs)
    print chaine
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom,prenom,telephone
    69,36,'sfdfs'
    INSERT INTO table(nom,prenom,telephone) VALUES (69,36,'sfdfs')
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,
    Pour tenir compte de la remarque de Drawingroom, on pourrait faire cela en deux temps:
    1. Construction du "template" SQL avec table et champs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> fields = 'nom', 'prenom', 'telephone'
    >>> s = 'insert into %s(%s) values(%%s)'
    >>> sql = s % ('table', ','.join(fields), ','.join(['%s'] * len(fields)))
    >>> sql
    'insert into table(nom,prenom,telephone) values(%s,%s,%s)'
    2. on exécute l'appel à l'API avec le "template" SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> a='69'
    >>> b='36'
    >>> c='sfdfs'
    >>> cursor.execute(sql,(a, b,c))
    le template SQL peut alors être passé en paramètre d'un "executemany" appliqué à l'ensemble des lignes récupérées du fichier SQL (en supposant que c'est une liste de listes).
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    merci. beaucoup mieux avec tous ces conseils

Discussions similaires

  1. insérer des valeurs dans une table sql via visual studio
    Par le sportif dans le forum VB.NET
    Réponses: 2
    Dernier message: 19/04/2014, 10h17
  2. Recherche dans une table SQL via Sharepoint
    Par cleml12 dans le forum Développement Sharepoint
    Réponses: 10
    Dernier message: 24/01/2012, 12h02
  3. [MySQL] Script d'importation csv vers une table (mysql) via un formulaire
    Par sarabaïte dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 17/03/2011, 06h31
  4. [phpMyAdmin] Importer un csv dans une table SQL
    Par Mohican69 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 17/08/2010, 13h07
  5. Réponses: 21
    Dernier message: 28/10/2009, 16h19

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