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 :

Openpyxl - Copie de données vers un WorkBook MemoryError


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 Openpyxl - Copie de données vers un WorkBook MemoryError
    Bonjour @ tous.

    Difficile de tous mettre dans le sujet alors je vous explique.

    J'ai créé un python, l'objectif étant de copier l'onglet d'un fichier ".xls" vers un fichier fraîchement créé en ".xlsx".

    Je suis donc initialement parti sur une boucle de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for row in range(0,nrows):
        for col in range(0,ncols):
            ws.cell(row=row+1, column=col+1).value = sheet.cell_value(row, col)
     
     wb.save('nouveau_fichier.xlsx')
    Jusque là aucun souci, tout fonctionnait à merveille jusqu'à ce qu'un fichier source, un peu lourd passe par là et me renvoi à la tête un message du genre : MemoryError

    J'ai donc décidé d'utiliser une méthode plus "light" en utilisant celle préconisée sur la doc officiel qui indique qu'il faut utiliser le paramètre write_only=True.

    J'ai donc modifié mon code en recopiant à l'identique celui de la documentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for row in range(nrows):
        ws.append(['%d' % i for i in range(ncols)])
     
    wb.save('nouveau_fichier.xlsx')
    Alors là, le résultat est...comment dire... surprenant puisqu'il indique dans chaque cellule destination un numéro correspondant au numéro de colonne et ce, sur chaque ligne :

    0 1 2 3 4 5 6
    0 1 2 3 4 5 6
    ...


    J'imagine donc que c'est le paramètre '%d' qui ne colle pas mais là impossible de trouver ce qu'il est possible de faire au niveau des propriétés de ws.append, je ne trouve aucune information.

    Pourriez-vous me donner un coup de main s'il vous plait ?

    Par avance merci .

    Geo-x

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,
    Citation Envoyé par Geo-x Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for row in range(nrows):
        ws.append(['%d' % i for i in range(ncols)])
    Si vous essayez cette ligne directement dans une console vous aurez le même résultat (en remplaçant ncols par 10):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(['%d' % i for i in range(10)])
    Vous demandez de créer une liste contenant i pour chaque i de 0 au nombre de colonnes-1. %d sert juste à formater comme chaine de caractères. Avec '%0.4f' vous auriez le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> ['0.0000', '0.0001', '0.0002', ...]
    Je ne vois pas le lien avec l'erreur de mémoire ou le "write_only=True".

    J

  3. #3
    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 Julien, et merci pour ces précisions !

    Le lien qu'il semble y avoir si je suis la doc, c'est que dans le cas d'une mémoire insuffisante, il est nécessaire de favoriser les paramètres "write_only=True" ou "read_only=True".

    Dans le cas de l'utilisation de ces derniers, la documentation utilise systématiquement la fonction ws.append (...)

    Maintenant, la question que je me pose, c'est comment je peux faire pour récupérer les valeurs de chaque ligne, puisque dans cet exemple je n'agis plus au niveau de chaque cellule, mais bien au niveau de chaque ligne ?

    Par ailleurs, vous dites

    %d sert juste à formater comme chaine de caractères
    Ou puis-je trouver les autres paramètres envisageables pour cette fonction ?

    En vous remerciant par avance.

    Geo-x

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Malheureusement je ne maîtrise pas du tout ce module...

    En regardant la doc au lien que vous fournissez, je comprends ceci:
    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
    from openpyxl import load_workbook
    from openpyxl import Workbook
     
    # Open source workbook in 'read_only' mode for memory consumption
    wb_src = load_workbook(filename='large_file.xlsx', read_only=True)
    # Open destination workbook in 'write_only' mode
    wb_dst = Workbook(write_only=True)
     
    # Create a new sheet in the destination workbook and copy and paste
    # everything from the source ('Sheet1') to the destination
    ws = wb.create_sheet()
    for row in wb_src['Sheet1'].rows:
        ws.append([cell for cell in row])
     
    wb.save('new_big_file.xlsx')
    Attention, je n'ai pas testé.

    Pour ce qui est du formatage des chaines de caractères, ce site est pas mal.

    Ju

Discussions similaires

  1. [XL-2010] Copie automatique données vers autre feuille
    Par OliFossa dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 19/02/2012, 20h20
  2. ouverture et copie de données vers un autre classeur variable
    Par mustapha.ezzaouia dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/12/2009, 14h24
  3. Réponses: 4
    Dernier message: 07/02/2009, 17h19
  4. copie des données d'un champ vers un autre
    Par cvlpj dans le forum IHM
    Réponses: 10
    Dernier message: 26/12/2006, 22h15
  5. Copie de base de données vers un autre PC
    Par claire.martin dans le forum Access
    Réponses: 19
    Dernier message: 06/01/2006, 14h20

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