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 :

Python et la manipulation de données dans un fichier *.xlsx [Python 3.X]


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Python et la manipulation de données dans un fichier *.xlsx
    Bonjour @ tous.

    Je débute sur Python, et je trouve ce langage plein de ressources intéressantes, c'est pour cette raison que je souhaite approfondir un peu le sujet.

    Pour débuter, j'utilise la version 3.5 de Python et le module openpyxl qui est visiblement l'un des plus performants à l'heure actuelle pour la manipulation de fichier *.xlsx.

    Ce que je souhaite faire c'est :

    1/ Ouvrir un fichier Excel existant
    2/ Créer un onglet vierge
    3/ Parcourir le tableau en lisant la colonne B et vérifier est remplit
    -- Boucle
    3.1/ Si elle est remplit, je récupère les valeurs contenues dans les cellules de A à F
    3.2/ Et je les colle dans le nouvel onglet
    -- Fin boucle
    4/ Je supprime mon onglet source pour ne garder que celui qui a les valeurs copiées

    Pour le moment, les étapes de 1 à 3 sont réalisées, mais je bloque sur les suivantes, notamment sur les 3.1,3.2.

    Voici le code existant :

    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
    25
    26
    import os
    import openpyxl
    from openpyxl import *
     
    wb = Workbook()
    wb= openpyxl.load_workbook('testfile.xlsx')
     
    # On active l'onglet courant
    ws = wb.active
     
    # On crée un nouvel onglet
    ws1 = wb.create_sheet()
    ws1.title = ws.title
     
    # On s'apprête à parcourir la colonne B
    translated = []
    begrow = 1
    endrow = ws.max_row
    for row in ws.iter_rows('B' + format(begrow) + ':B' + format(endrow)):
        for cell in row:
            if cell.value is not None:
                print(cell.value)      
     
    wb.save('testfile_new.xlsx')
    ws.close()
    xl.Quit()
    Dans l'idéal j'aurais aimé supprimer les lignes dont la colonne B est vide, mais j'ai cru lire que ce n'était pas possible, d'ou cette solution 'alambiquée'.

    Auriez-vous une idée qui me permettrait d'aller au bout de ma réflexion ?

    En vous remerciant par avance.

    Geo-x

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Bonjour,

    Je suis débutant mais travaille aussi avec python pour du Excel. J'utilise personnelement xlwt pour ecrire et xlrd pour lire excel. Je ne connaissais pas Openpyxl. Mais le principe reste globalement le même j'ai l'impression.
    Je traiterrai ça sous forme de liste, append chaque éléments de la colonne B dans une liste comme "colonne_B"
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for text,i in enumerate(colonne_B):
         if text!='':
    #faire une boucle pour recupérer les éléments de la ligne indice 'i'
     
    #à la fin apres avoir répurer la ligne l'écrire sur l'autre feuille
    Je sais pas si j'ai été très clair, mais je ne connais pas trop les commandes pour ce module si...
    Si tu as d'autres questions

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Re,

    Essayes ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    column_B=[]
    for index, row in enumerate(ws1.iter_rows('B')):
        for cell in row:
            column_B.append(ws1.cell(row=index + 1, column=1).value)
    Valentin.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Bonjour Stabilo, merci de tes réponses.

    J'ai déjà essayé la méthode avec le append, mais le problème c'est que ça intègre la valeur d'une colonne dans un ARRAY à la suite.

    Par exemple dans ce cas, je n'aurais que : [col1.ligne1,col1.ligne2,col1.ligne3,col1.ligne4] alors qu'il me faudrait : [col1.ligne1,col2.ligne1,col3.ligne1,col4.ligne1,col5.ligne1] que je copierais ensuite dans un nouvel onglet, avant de passer à la ligne suivante et ça, je ne sais pas faire...

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Pour écrire avec ton module j'ai trouver ça sur le net :

    http://openpyxl.readthedocs.io/en/de...ite-a-workbook

    je ne sais pas si ça peut t'aider

    Valentin.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Merci Valentin, je connaissais cette documentation, mais je n'arrive pas à l'appliquer à mon cas

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 132
    Points : 130
    Points
    130
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> for row in range(10, 20):
    >>>   for col in range(27, 54):
    >>>      ws3.cell(column=col, row=row, value="%s" % get_column_letter(col))

    Alors ici :
    -on parcourt les ligne de 10 à 19 et les colonne de 27 à 53
    -on fait un cadriage car la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws3.cell(column=col, row=row, value="%s" % get_column_letter(col))
    sert à ecrire sur la feuille ws3 à la cellule de coordonnée (row,col) qui varie avec les for i.

    -ensuite on écrit "value="%s" % get_column_letter(col)" dans la cellule parcouru.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "%s" % get_column_letter(col)"
    ça c'est juste un truc barbare pour convertir "col" qui va donc de 27 à 53 en string.

    Je ne sais pas si j'ai été clair sinon n'hésites pas, normalement je n'ai pas dit de bêtises..

    Valentin.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Merci !
    Merci Valentin, en fait il me manquait bien une explication, puisqu'il ne me semblait pas que la solution proposée, collait à mes besoins.

    Aussi, je suis reparti de cette base et je l'ai légèrement modifié pour atteindre le code suivant

    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
    25
    26
    27
    28
    29
    import os
    import openpyxl
    from openpyxl import *
    from openpyxl.utils import get_column_letter
     
    wb = Workbook()
    wb= openpyxl.load_workbook('testfile.xlsx')
     
    # On active l'onglet courant
    ws = wb.active
     
    # On crée un nouvel onglet
    ws1 = wb.create_sheet()
    ws1.title = ws.title
     
    # On s'apprête à parcourir la colonne B
    translated = []
    begrow = 1
    endrow = ws.max_row
    for row in range(begrow,endrow):
        endrows1 = ws1.max_row + 1
        for col in range(1, 7):
            print (endrows1)
            if ws['B' + format(row)].value is not None:
                ws1.cell(column=col, row=endrows1, value=ws[format(get_column_letter(col)) + format(row)].value)
     
    wb.save('new_big_file.xlsx')
    wb.close()
    xl.Quit()
    En-dehors d'un léger souci d'incrémentation (c'est à dire que je ne commence à coller qu'à partir de la ligne 2 au lieu de la 1 et je ne sais pas pourquoi), tout fonctionne !

    Un grand merci

    Geo-x

  9. #9
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Les indices en python commencent à 0 et non à 1.
    Pas d'aide par mp.

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

Discussions similaires

  1. [Python 3.X] Python, et sqlite : effacer des données dans un formulaire de saisie
    Par mfanfan dans le forum Général Python
    Réponses: 1
    Dernier message: 08/03/2015, 10h26
  2. Manipuler les données dans une base de données
    Par Ismatus1 dans le forum Tkinter
    Réponses: 9
    Dernier message: 28/11/2011, 14h15
  3. manipulation de donnée dans un tMap
    Par Zinou7 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 19/06/2010, 16h40
  4. Réponses: 6
    Dernier message: 05/05/2010, 10h18
  5. [Tableaux] Manipulation de données dans un Array
    Par arnaudperfect dans le forum Langage
    Réponses: 4
    Dernier message: 06/02/2009, 16h35

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