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 :

Traitement d'un fichier txt


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut Traitement d'un fichier txt
    Bonjou tout le monde.

    J'avais posté hier un sujet pour la traitement d'un fichier XL, mais ca a été plus compliqué que prévu.

    Donc j'ai eu l'idée de le tableau de deux colonnes en plusieurs lignes, dont les données sont séparée par des ';'.

    Pour ceux qui ne connaissent pas le tableau (lignes). Chaque ligne contient un id de l'élève ainsi que son nom.


    Donc je cherche maitenant un programme qui me permet d'afficher le nom de l'élève pour chaque client, et c'est tout. Sans oublier de ne pas prendre la première ligne en compte, car elle contient le titre du document.

    Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    Citation Envoyé par anass_59 Voir le message
    afficher le nom de l'élève pour chaque client, et c'est tout
    afficher le nom de l'élève je comprends, mais ça veut dire quoi "pour chaque client" ?

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut
    Oups faute d'innatention

    Je voulais dire pour chaque id ...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut
    Bonjour,

    Ca, je connais, je suis en plein dedans...
    Mon fichier texte, je lui ai affecté une extension non pas en .txt, mais en .csv que j'ouvre avec mon tableur qui me propose comme séparateur par défaut la vigule.
    Si tu as choisi le ; c'est pas un problème, tu le signales à l'ouverture.

    Ce que j'ai fait (en mode très naïf : j'apprendrai donc bcp des autres réponses), par exemple pour la création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    n = nb de lignes de donnees
    fichier=open('ASSR.csv','w')
    L=[['Dupont','07175'],['DURAND','06124']...]
    titre='Identite,Numero'+'\n'
    fichier.write(titre)
    for j in range(n):
        ligne=L[j,0]+','+L[j,1]+'\n'
        fichier.write(ligne)
    fichier.close()
    Reste deux problèmes :
    1. Liste ordonnée ou pas ?
    Donc problème de tri...
    Que j'ai résolu comme ça (encore naïvement) :
    L=['Dupont_07175','DURAND_06124',..]
    (avec des noms tous du même nombre de caractères)
    L.sort()
    puis j'ai séparé les enregistrements en 2, via unsc=L.find('_')
    et restocké le tout.
    Il y a aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >>> L=[('c', 2), ('d', 1), ('a', 4), ('b', 3) ]
    >>> L.sort(lambda a, b: cmp(a[0], b[0]))
    >>> L
    [('a', 4), ('b', 3), ('c', 2), ('d', 1) ]
    mais je ne sais plus pourquoi, ça ne m'allait pas..

    2 Le nom du dossier courant
    Résolu en utilisant l'import de glob et de getcwd
    rep=getcwd() donne le nom du répertoire courant
    puis fichier=open(rep+chr(92)+'ASSR.csv','w')
    chr(92) : \

    Pour la lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    fichier=open('ASSR.csv','r')
    L=fichier.readlines()
    n=len(L)
    for j in range(n):
        ligne=L[j]
        print ligne,
    @+

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    il existe un module dédié python pour les fichier csv:

    http://docs.python.org/library/csv.html

    plutôt qu'une liste de liste, j'aurais plutôt mis une liste de tuples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    L=[(7175,'Dupont'),(6124,'DURAND')...]
    du coup, on peut facilement trier par id croissant:
    si on veut trier par ordre alphabétique, on peut remplacer le tuple (id,name) par (name,id).

    l'écriture devient (en utilisant l'itérateur des listes, c'est mieux que de passer par range ou xrange ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (name,id) in L:
        fichier.write("%i,%s\n" % (id,name))
    attention à ne pas utiliser chr(92) qui n'est pas portable mais plutôt os.sep.

    pour la lecture, je préfère aussi utiliser l'itérateur du fichier (plus concis et en cas de gros fichier on encombre pas la mémoire avec readlines):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichier=open('ASSR.csv','r')
    for ligne in fichier:
        print ligne,

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut
    Bonjour,

    Intéressant !
    Pas pensé à la liste de tuples...
    Pas pensé à for ligne in fichier
    anass_59 semble n'avoir qu'un fichier à traiter à la fois.
    Moi, j'en gère 6, ouverts simultanément,de longueurs différentes pour en faire un 7e, alors je vais voir comment adapter tes suggestions...
    Y a-t-il un moyen de connaître la longueur d'un fichier sans le charger ?

    Je ne pollue pas plus longtemps le topic de anass_59

    Merci,

    @+

Discussions similaires

  1. traitement d'un fichier txt par un srcipt shell
    Par GHISLINO dans le forum Linux
    Réponses: 12
    Dernier message: 07/11/2011, 13h05
  2. Réponses: 93
    Dernier message: 15/04/2009, 15h34
  3. traitement d'un fichier txt
    Par arezki76 dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 22/06/2007, 14h36
  4. Réponses: 9
    Dernier message: 03/01/2007, 17h06

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