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 :

Trier des lignes dans un fichier


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Trier des lignes dans un fichier
    Bonjour,

    Je débute en python. J'ai un fichier texte contenant des lignes regroupant des infos du type :

    blabla personne1 {
    blabla tache1
    blabla date et heure,
    blabla date et heure
    .....
    blabla tache2
    }

    blabla personne2 {
    blabla tache1
    blabla date et heure,
    blabla date et heure
    .....
    blabla tache2
    }
    ...

    Je souhaiterais obtenir un nouveau fichier du type:
    blabla tache1{
    blabla date et heure,
    blabla date et heure
    .....
    blabla persone1
    }

    Je suppose qu'il faut aller d'abord lire dans le fichier ligne par ligne fsreadline puis créer un dictionnaire ou une liste à chaque mot clé puis réécrire dans un nouveau fichier mais je m'y perd un peu...

    Quelqu'un pourrait-il m'aider svp?

    Merci beaucoup et bonne journée à tous!

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 914
    Points : 7 298
    Points
    7 298
    Par défaut
    J'avoue que je comprend pas trop bien ce que tu demandes.

    Tes blablas me troublent un peu faut dire

    Dans ton exemple, tu veux faire des inversions de ligne.

    En 1ere ligne tu mettrais les taches
    En 2eme ligne tu mettrais les dates et heures
    En 3eme ligne tu mettrais les personnes

    c'est ça???

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour Fred,

    Je n'ai effectivement pas été clair mais ce n'est pas évident. J'ai un fichier qui regroupe des personnes. Chaque personne a effectué un certain nombre de tâche. Et pour réaliser la tache la personne a travaillé un certain nombre d'heure.
    Le fichier liste donc par personne le nombre d'heure qu'elle a travaillé sur chaque tache.

    Ce que je voudrais c'est obtenir pour chaque tache le nombre d'heure travaillées total (par une ou plusieurs personnes). Donc à chaque mot clé tache, récupérer les heures des lignes initialement en dessous pour chaque personne et les associer afin d'obtenir l'ensemble des taches avec leur durée.

    J'espère avoir été un peu plus clair...

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Bienvenue sur le forum,


    Il m’est arrivé de commencer à aider des gens qui voulait faire un traitement de fichier et j’ai constaté que le problème finissait souvent dans les sables.

    C’est parce que mine de rien, sans être très difficile, ce genre de problème est assez prise de tête et que les échanges tournent vite à l'embrouillamini. De plus je crois que ma façon d’envisager le problème n’est pas ce qui a le plus cours. En fait je n’en sais rien, parce qu’on ne voit pas beaucoup ce genre de problèmes traités de façon fouillée, me semble-t-il.




    Alors voilà, je balance ma solution toute faite sur un fichier que je me suis créé pour l’occasion à partir de tes indications.

    Je n’ai pas fait la somme des heures pour chaque tache en sommant sur toutes les personnes ayant fait une tache.

    je me suis aperçu après coup que le format des heures que j’ai mises n’est pas réaliste par rapport au problème.

    Mais tu pourras facilement modifier les éléments des expressions réguliéres qui concernent les heures, et faire la sommation des heures. Ce peut être fait en même temps qu’on enregistre le nouveau fichier d’ailleurs.




    Je me suis bien amusé. Mais si ça paraît obscur à certains endroits, n’hésite pas à demander. Cherche un peu avant, toutefois, c’est plus formateur.

    J’aime bien le itemgetter(1,0) qui trie la liste d’un seul coup sur la base de deux critères a la fois.



    J’aimerais bien savoir comment d’autres feraient pour lire le fichier dans ce problème. Mais personne ne s’étant précipité sur ce problème jusqu’à présent, il risque de ne pas y avoir beaucoup d’écho.


    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    f = open('zxy.txt')
    ch = f.read()
    f.close()
     
    import re
     
    debr = re.compile('PERS ([^ ]+) {\n[^ ]+ tache\d+\n.+?}',re.DOTALL)
    task = re.compile('[^ ]+ (tache\d+)\Z')
    dateheure = re.compile('[^ ]+ (\d\d/\d\d/\d\d\d\d \d\d:\d\d),?\Z')
     
    L,li = [],[]
    for (name,fh) in ( ( m.group(1),m.group(0).splitlines()[1:-1]) for m in debr.finditer(ch) ):
        for ln in fh:
            mdh = dateheure.match(ln)
            if mdh:
                li.append(mdh.group(1))
            else:
                mt = task.match(ln)
                if mt:
                    if li:
                        L.append((name,nom_tache,li))
                        li = []
                    nom_tache = mt.group(1)
                elif ln:
                    print repr(ln)
                    raw_input(38*'*'+'\n* Attention:  ligne non orthodoxe !! *\n'+38*'*')
        L.append((name,nom_tache,li))
        li = []
     
     
    liste_taches = []
    [ liste_taches.append(tache) for (name,tache,li) in L if tache not in liste_taches ]
     
    from operator import itemgetter
    L.sort(key=itemgetter(1,0))
    print 'Liste L triee :\n\n'+'\n\n'.join([ repr(u) for u in L])
     
     
    f = open('zxy double.txt','w')
    name_en_cours = ''
    tache_en_cours = ''
    for (name,tache,li) in L:
        if tache != tache_en_cours:
            tache_en_cours, name_en_cours = tache,name
            f.write('\n---------------------------------\n'+tache_en_cours+'\n\n'+name_en_cours + '\n')
        if name != name_en_cours:
            name_en_cours = name
            f.write('\n'+name_en_cours + '\n')
        f.write('\n'.join(li)+'\n')
    f.close()
    Fichiers attachés Fichiers attachés
    • Type de fichier : txt zxy.txt (925 octets, 197 affichages)

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 914
    Points : 7 298
    Points
    7 298
    Par défaut
    Franchement j'adore python, mais faut pas pousser, je suis pas mazo

    Il y a des logiciels nettement plus approprié pour faire ce genre de travail dont excel, tableur open office, etc...

    Même si eyquem s'est bien amusé, en ce qui me concerne, je ne serais pas d'accord pour faire ce genre de programme ne connaissant pas exactement le fichier texte. C'est le genre de problème qui va prendre une plombe, en donnant des données importantes goutte à goutte.

    Mais bon comme eyquem je ne vois pas autrement que par les regex.

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Merci pour cet écho , fred1599



    Dis moi si je comprends bien, stp; tu penses que :

    • sur le plan du principe, écrire spécialement un code pour ce genre de problème n’est pas une stratégie pertinente ? Que ce soit en Python ou en un autre langage, d’ailleurs, je suppose.

      Je suis assez d’accord. Il y a une telle profusion de logiciels en tous genres susceptibles de couvrir tous les besoins que je me demande toujours comment il se fait que certains ne sont pas arrivés à en trouver un qui leur convienne.
      Est-ce par difficulté de trouver le bon dans la masse ? Par difficulté d’apprendre à piloter un logiciel imposant, alors qu’on n’aura besoin que de quelques unes seulement de ses fonctionnalités ?.......
      Parce que je me fais des illusions sur les capacités des logiciels existant à être adaptés pour le traitement des fichiers rencontrés au quotidien ?

    • sur le plan pratique, en disant
      C'est le genre de problème qui va prendre une plombe, en donnant des données importantes goutte à goutte
      tu veux dire la même chose que moi: ça devient vite embrouillé d’échanger sur un forum sur ce genre de problème ?



    –------------------------


    Ceci dit, sur le plan technique,

    Il est possible de ne pas utiliser de regex pour le problème simple exposé par ptidragonbleu
    Serait-ce mieux ?
    Mon code est-il compliqué ou sinueux ?
    Quelle sorte de code feriez vous pour ce problème (en admettant que vous ne vous arrêtiez pas à l’opposition par principe évoquée plus haut) ?

    Le risque latent avec ce genre de problème, c’est que n’importe quel programme conçu spécialement pour traiter un fichier peu standardisé comme semble l’être celui de ptidragonbleu peut soudainement bugguer à cause d’un changement, même minime, intervenant dans les fichiers traités, donnant un cas qui n’a pas été prévu. Il y a donc un problème qui se pose, qui est ce qu’il y a en amont: la conformité du texte traité et la façon dont il est produit.
    Or ceux qui posent ce genre de questions font rarement référence à cet amont , me semble-t-il.

    Dans ces conditions, la question qui m’agite est multiple:
    • La démarche de fond ne doit elle pas être de ne créer et manipuler que des fichiers dans un format donné et non pas un format personnel bricolé succintement ? : XML ou je ne sais quel autre format à balises, ou autre chose encore sans balises ? , je ne suis pas assez calé, je n’ai jamais fait le tour de la question.
    • Face à une question comme celle de ptidragonbleu, que faut-il faire ?
      - Répondre à son attente avec un code de maso comme le mien ?
      - Utiliser comme le dit fred1599 Excel, un tableur, etc. Mais lequel, quoi-comment exactement ? Je me demande toujours ce qu’il y a dans ce petit mot en 3 lettres: etc. On peut vraiment lancer un logiciel tout prêt sur le fichier au format simpliste que j’ai mis en PJ ?
    • D’un point de vue global, comment pratiquez vous avec vos fichiers ? Fabriqués personnellement ? Tous standardisés et manipulés par un logiciel idoine ? Quels logiciels ? Vous aimez bidouiller vos propres personnalisations, vous l’éviter ?


    Enfin bref, soyez diserts, ça m’intéresse.....

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par eyquem Voir le message
    Enfin bref, soyez diserts, ça m’intéresse.....
    Je ne suis pas motivé par toutes les questions, mais celle-ci m'intéressait. La manipulation de données sous forme de liste fait partie des forces de Python.

    Alors, j'ai commencé et pris l'exemple donné (les blabla...) en copier-coller afin de définir la meilleure structure de données. Il me semble que c'est la première chose à faire, avant de sauter sur le code de lecture du fichier puis celui d'extraction/mise en forme vers le résultat attendu.

    Et puis... j'ai abandonné au bout de quelques minutes. Pourquoi? parce que la question laisse beaucoup trop de choses non définies, et que l'informatique demande plus de rigueur que ça. Par exemple:

    - par quoi peut-on remplacer les blabla?
    - peut-il y avoir des lignes vides?
    - les '{' et '}' sont-ils forcément en fin de ligne?
    - dans le but à atteindre, la ligne personne1 peut-elle être suivie d'informations concernant cette personne?
    - etc...

    Bref, pour travailler sur une question, j'attends que cette question présente des éléments (code ou exemple) sur lesquel on peut travailler en copier-coller sans passer une 1/2h à essayer de deviner ce qui manque...

    Cet avis est général et ne concerne pas seulement ptidragonbleu: quand on demande une aide, il faut faire l'effort de faciliter le travail des personnes qui peuvent en apporter.

    A part cela, je suis sûr qu'on peut résoudre ce problème sans regex, et si le questionneur veut bien donner un exemple comme je le souhaite (données de départ et données d'arrivée), je suis prêt à le montrer.

    Tyrtamos

  8. #8
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Merci pour ta réponse Tyrtamos.

    Elle me rassure un peu parce qu’elle me permet de constater que je ne suis pas le seul à avoir des difficultés à comprendre certaines questions et à trouver qu’elles manquent souvent de renseignements suffisants.

    J’ai souvent exactement les mêmes réactions devant une question:
    - la question laisse beaucoup trop de choses non définies
    - l'informatique demande plus de rigueur que ça
    - j'attends qu’une question présente des éléments (code ou exemple) sur lesquel on peut travailler en copier-coller sans passer une 1/2h à essayer de deviner ce qui manque

    Il m’arrive effectivement de m’apercevoir que j’essaie de deviner sur la base d’indices analysés dans la question quelle peut être véritablement la question.

    Je suis sidéré que, dans une discipline aussi rigoureuse que l’informatique, les gens ne soient pas capables de se rendre compte de la déficience de leurs questions et qu’ils n’arrivent pas à se représenter quelle pourra être la réception de leur question par le lecteur ignare de leur problème. Ce constat va parfois jusqu’à me faire monter la moutarde au nez , un peu bêtement peut être, mais enfin pas sans motif je crois.



    Ceci dit, pour un problème tel que celui de ptidragonbleu, il y a un cercle vicieux:
    • pour fournir des informations suffisantes dans une question, il faut savoir quelles sont les types d’informations pertinents relativement à un traitement informatique;
    • pour savoir cela, il faut connaître les manipulations et les structurations de données qui sont disponibles avec le langage;
    • et pour connaître ces possibilites et bien comprendre les caractéristiques, contextes, mises en comparaison, pertinences des différentes solutions, c’est surtout en ayant fait concrètement quelques codes que cela s’acquière



    La seule solution me semble-t-il est de faire ce que j’ai fait:
    - décider arbitrairement du contenu d’un fichier.
    Par exemple, mon fichier zxy.txt ne comporte pas de texte après tacheX, ni entre le nom et le caractère {, et les regex que j’ai écrites ne fonctionnent que si ceci est respecté.
    - sur un tel fichier arbitrairement précisé, faire un code complet qui va représenter un cas démonstartif décortiquable qui puisse être une base départ






    À part ça, est-ce que le fichier que j’ai mis en PJ peut êre traité comme le veut ptidragonbleu par un logiciel déjà existant style Excel, tableur etc ?

    Y aurait-il quelqu’un qui puisse expliquer une telle utilisation ?

    Car normalement, d’aprè la réponse de fred1599, il devrait être plus simple-efficace-rapide-productif-etc d’utiliser un logiciel tout prêt , uuuh ?

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 914
    Points : 7 298
    Points
    7 298
    Par défaut
    sur le plan du principe, écrire spécialement un code pour ce genre de problème n’est pas une stratégie pertinente ? Que ce soit en Python ou en un autre langage, d’ailleurs, je suppose.
    Oui

    tu veux dire la même chose que moi: ça devient vite embrouillé d’échanger sur un forum sur ce genre de problème ?
    Oui c'est pourquoi il serait beaucoup plus simple d'avoir le fichier txt.

    Mais bon c'est peut-être confidentiel, donc à lui de juger.

    Il est possible de ne pas utiliser de regex pour le problème simple exposé par ptidragonbleu
    Serait-ce mieux ?
    J'aime bien les regex, et même si la solution est un peu plus lente (ce qui n'est jamais important pour moi, dans mes cas utilisés), la précision est là.

    Le risque latent avec ce genre de problème, c’est que n’importe quel programme conçu spécialement pour traiter un fichier peu standardisé comme semble l’être celui de ptidragonbleu peut soudainement bugguer à cause d’un changement, même minime, intervenant dans les fichiers traités, donnant un cas qui n’a pas été prévu. Il y a donc un problème qui se pose, qui est ce qu’il y a en amont: la conformité du texte traité et la façon dont il est produit.
    Or ceux qui posent ce genre de questions font rarement référence à cet amont , me semble-t-il.
    Exact, dont l'utilité de faire ce genre de travail avec un logiciel adéquat.

    La démarche de fond ne doit elle pas être de ne créer et manipuler que des fichiers dans un format donné et non pas un format personnel bricolé succintement ? : XML ou je ne sais quel autre format à balises, ou autre chose encore sans balises ? , je ne suis pas assez calé, je n’ai jamais fait le tour de la question.
    idem

    D’un point de vue global, comment pratiquez vous avec vos fichiers ? Fabriqués personnellement ? Tous standardisés et manipulés par un logiciel idoine ? Quels logiciels ? Vous aimez bidouiller vos propres personnalisations, vous l’éviter ?
    Je n'utilise les fichiers txt que dans le cas d'une récupération de données, et encore... quand ça peut se faire directement je le fais.

    Sinon oui j'aime bien toucher à tous les logiciels et utiliser python pour les parties répétitives d'un problème (électricité) dans mon cas.

    Mes connaissances sur python sont largement suffisantes pour répondre à mes attentes, mais pas pour les autres demandes de certains forumer.
    Mais en ce qui me concerne, je n'ai pas fais d'études en info et je m'estime heureux d'avoir découvert un langage de programmation et de l'utiliser dans mes domaines de travail.


  10. #10
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Une question importante, je pense, est : Peux-tu remplacer ce qui produit le fichier en question par un programme de ton cru ?
    Si oui, cela simplifie grandement les choses, car tu n'aurais plus à faire une analyse syntaxique d'un fichier, mais à ranger des données dans un objet ( qu'on pickle ?) et à crée une méthode pour cet objet qui retournerait (ou écrirait directement dans un fichier) un texte dont le format respecterait "l'ordre de priorité" passé en paramètre (par ex : d'abord les dates, ensuite les personnes, puis les taches, et enfin le nombre d'heures passées par cette personne sur cette tache à cette date)

    Il est vrai qu'il manque pas mal d'informations, comme, le but (à un niveau plus global) ? A partir d'où commence ton champ d'action (en gros, même question qu'au début de ce message, peut-on remplacer des choses en amont) ?
    Il serait sûrement plus efficace et moins tarabiscoté de faire en un programme ce que deux ou plus bout à bout feraient...

    EDIT : c'est sur que ça fait redite maintenant que c'est posté quatre heures après rédaction...

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour et merci à tous pour vos réponses.

    Effectivement la méthode des expressions régulières est la plus évidente une fois qu'on la connait...

    Mais c'est franchement un peu lourd je suis d'accord avec Fred.

    je dois encore pousser un peu pour saisir toutes les subtilités.

    Merci pour votre aide en tout cas

Discussions similaires

  1. [CSV] Ajouter et supprimer des ligne dans un fichier CSV
    Par gpsevasion dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2007, 17h00
  2. Attraper des lignes dans un fichier excel
    Par melodyyy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/01/2007, 11h27
  3. Ajouter des lignes dans un fichier *.log
    Par Fred2209 dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/12/2006, 15h15
  4. Recupérer des lignes dans un fichier ou une variable
    Par vince2005 dans le forum Langage
    Réponses: 12
    Dernier message: 29/09/2006, 18h46

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