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 un fichier


Sujet :

Python

  1. #1
    Membre actif
    Inscrit en
    novembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 516
    Points : 222
    Points
    222
    Par défaut Trier un fichier
    Quelqu'un sait-il comment trier un fichier sous Python.
    Mon fichier est un fichier texte, chaque variable est séparée par un ';' (point-virgule).
    Je voudrais pouvoir le trier selon certaines variable.
    Merci d'avance

  2. #2
    Membre régulier
    Avatar de Olivier_
    Profil pro
    Inscrit en
    mars 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2005
    Messages : 111
    Points : 124
    Points
    124
    Par défaut
    Salut,

    tu peux faire un split sur la chaine avec le point virgule en paramètre
    Et ensuite tu tries la liste resultante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    f = open('monfichier.txt', 'r')
    txt = f.read()
    f.close()
     
    txtList = txt.split(';')
    triTxt = sorted(txtList)
    Après, eventuellement tu remet la liste sous forme de texte avec la méthode dont j'ai oublié le nom :p (qui fait l'inverse du split)

  3. #3
    Membre régulier
    Avatar de Olivier_
    Profil pro
    Inscrit en
    mars 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2005
    Messages : 111
    Points : 124
    Points
    124
    Par défaut
    J'ai remis le nom sur la méthode inverse de split.

    join()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    txt = ';'.join(triTxt)
     
    f = open('monfichier_resultat.txt', 'w')
    f.write(txt)
    f.close()
    Wala qui devrait fonctionner (pas tester)

    <edit> Après test, ça merdouille je sais pas trop pourquoi.
    Avec ce fichier en entrée :
    un text;
    2 text;
    alors un txt;
    Ca me sort :
    ;
    2 text;
    alors un txt;un text
    Ca doit pas être grand chose, c'est au niveau du join que ça déconne, en fait le ';' se met au début de chaque élément de liste, et il faudrait le contraire.
    Soit y a moyen avec la méthode join, soit il ne reste qu'à faire une p'tite fonction pour le faire (simple).

  4. #4
    Membre actif
    Inscrit en
    novembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 516
    Points : 222
    Points
    222
    Par défaut
    Citation Envoyé par Olivier_
    tu peux faire un split sur la chaine avec le point virgule en paramètre
    Et ensuite tu tries la liste resultante.
    Merci Olivier, mais si mon fichier est gros, il peut y avoir quelques difficultés à ce qu'il soit chargé en mémoire. D'où mes deux questions suivantes :
    1-Quelle routine utiliser dans ce cas
    2-Un fichier de 256 ko est-il trop gros pour être chargé en mémoire
    Merci

  5. #5
    Membre du Club Avatar de Mr Hyde
    Profil pro
    Inscrit en
    janvier 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2004
    Messages : 80
    Points : 62
    Points
    62
    Par défaut
    Salut!

    1) La solution d'Olivier fonctionnera avec un gros fichier (mais ca sera forcément plus long)

    2) J'ai deja chargé et "trié" des fichiers textes de plus de 15Mo en python...je pense que ca repond a ta question!

  6. #6
    Membre régulier
    Avatar de Olivier_
    Profil pro
    Inscrit en
    mars 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2005
    Messages : 111
    Points : 124
    Points
    124
    Par défaut
    La p'tite fonction pour recréer le fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def joinAfter&#40;liste, car&#41;&#58;
       string = ''
       for elt in liste&#58;
          string += elt + car
       return string
    Sinon, il va y avoir un pépin au niveau des sauts de lignes aussi.
    Il faudrait affiner un peu la chose en supprimant les \n du doc avant de faire le split et d'ajouter les \n à la fin de chaque ligne dans la fonction "joinAfter"

    Mais là, tout dépend du "format" de ton fichier.
    Tes ELT; peuvent-ils se trouver sur la même ligne ou non ?
    Suivant le cas, un split('\n') peut être plus adapté et il n'y aurais plus alors qu'à recoller comme il faut la liste triée.

    Sinon, à la place de sorted(liste), utilise liste.sort() ça utilisera moins de "cases" mémoires. Tu n'as pas besoin de copier la liste ici (ce que fait sorted() contrairement à sort())

    Si on avait une idée plus précise du fichier et des besoins ça aiderait

Discussions similaires

  1. trier les fichiers dans l'explorateur windows
    Par imeys dans le forum Windows XP
    Réponses: 1
    Dernier message: 31/03/2006, 00h52
  2. Trier un fichier
    Par Premium dans le forum C
    Réponses: 12
    Dernier message: 23/01/2006, 10h12
  3. trier des fichiers avec un tableau flexgrid
    Par digger dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 08/12/2005, 16h20
  4. [XSLT] - Trier un fichier sur plusieurs critères
    Par ytse dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/10/2005, 17h26
  5. Trier les fichiers par type et les afficher par groupe ...
    Par KneXtasY dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 18/09/2005, 19h50

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