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 :

Petit probléme de debutant (Probléme d'écriture de fichier et concatenation)


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut Petit probléme de debutant (Probléme d'écriture de fichier et concatenation)
    Bonjour , celà fait quelques jours que je "m'amuse" avec python (ainsi qu'avec le developpement en général). Je trouve d'ailleurs ce langage de plus en plus fabuleux .

    Je pense avoir correctement cherché sur le forum et ailleurs mais je ne trouve pas la réponse à mon probléme , j'essaie de faire un petit bout de code qui liste le contenu d'un repertoire dans un fichier .En plus de ça j'aimerais indexé chaque ligne par un numéro .


    (Excusez moi pour mon code trés brouillon ... je debute )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import os 
     
    rep = raw_input('Quel repertoire lister ? ')
     
    file = open( 'liste.txt', 'w') 
    liste = (os.listdir(rep))  #je creé mon tuple avec contenant le resultat du listing du repertoire.
    for i in liste:
          file.write( i + '\n' )
    file.close()
    print "C'est fait :)"
    Jusqu'ici ça va à peu prés sans trop de problémes .. maintenant j'essaie de rajouter l'indexation ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import os 
     
    rep = raw_input('Quel repertoire lister ? ')
     
    file = open( 'liste.txt', 'w') 
    liste = (os.listdir(rep))  #je creé mon tuple avec contenant le resultat du listing du repertoire.
    compteur = 0
    for i in liste:
        compteur = compteur + 1
        file.write( compteur + i + '\n' ) #c'est là que ça cloche
    file.close()
    print "C'est fait :)"
    L'interpréteur python me dit qu'il ne peut pas concatener des entiers(compteur) et des chaines de caractéres (i)...

    j'ai essayé uniquement avec file.write(compteur) pour tester, là python me dit qu'il ne veut meme pas écrire d'integer ... erf .. je ne comprends plus trop ... y a t il une autre méthode d'écrire dans les fichiers ou concatener des integer et des string ?
    Ou dois - je aller me coucher ?

    J'espére avoir été le plus clair précis .
    En tout cas merci pour toutes vos futur réponses

    Cordialement.

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    str(obj) permet de transtyper un objet en string
    => file.write( str(compteur) + i + '\n' )

    Et si tu veux liste l'arborsences d'un répertoire:
    http://python.developpez.com/faq/?pa...tenuRepertoire

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut
    Impéccable

    Merci beaucoup pour la réponse rapide c'est parfait j'ai le resultat voulut .

    Pour le liens je m'étais effectifement servit de celui ci pour savoir comment lister un repertoire .

    Je place mon once de code (coder avec les pieds) et à optimiser bien sur, ici , si ça peut interesser d'autres debutants on ne sait jamais.

    fonctionnement :
    Demande à l'utilisateur d'entrer un chemin de repertoire , le liste et ecrit un fichier "liste.txt" contenant le contenu du fichier, indexé du numéro de ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import os 
     
    rep = raw_input('Quel repertoire lister ? ')
     
    file = open( 'liste.txt', 'w')
    liste = (os.listdir(rep))
    compteur = 0
    for i in liste:
        compteur = compteur + 1
        file.write( str(compteur)+'  '+ i + '\n' )
    file.close()
    print "C'est fait :)"

  4. #4
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    si tu veux le faire en une ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> open('liste.txt', 'w').write('\n'.join([str(j) + "\t" + k for j,k in enumerate(os.listdir('.'))]))

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut
    Merci beaucoup pacificator ,j'ai testé ta ligne cela est en effet beaucoup plus rapide .. en revanche en tant que bon novice j'avoue ne pas bien comprendre le fonctionnement celle ci je suis donc rester avec ma possibilité de debutant certes mais dont je comprends le code .

  6. #6
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    bonjour,
    expression expliquée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> open('liste.txt', 'w').write('\n'.join([('%d\t%: s' % (index, fichier))
    ... for index, fichier in enumerate(os.listdir('.'))]))
    Analysons l'expression à rebours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import os
     
    # lister le contenu d'un repertoire
    print os.listdir('.')
    Nous recuperons la liste des fichiers du repertoire, c'est le debut.
    Nous voulons obtenir l'ordre des fichiers présents dans notre liste,
    nous utilisons donc la fonction enumerate

    l'aide de enumerate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> help('enumerate')
    Help on class enumerate in module __builtin__:
     
    class enumerate(object)
     |  enumerate(iterable) -> iterator for index, value of iterable
     |
     |  Return an enumerate object.  iterable must be an other object that supports
     |  iteration.  The enumerate object yields pairs containing a count (from
     |  zero) and a value yielded by the iterable argument.  enumerate is useful
     |  for obtaining an indexed list: (0, seq[0]), (1, seq[1]), (2, seq[2]), ...
     |
    enumerate est un iterateur,
    il prend en argument un objet iterable (liste, chaine de caractères, ..)
    à chaque iteration, il parcourt l'objet, avance d 'un élement et
    renvoie un tuple (a, b) où:
    a est l'index de l'element b de l'objet iterable.
    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
    # avec une chaine de caractere
    for index, caractere in enumerate('toto'):
        print "lettre %s est a l'index %d" % (caractere, index)
     
    # avec un fichier ouvert en lecture
    fichier = open('fichier_1.txt')
    for index, ligne in enumerate(fichier):
        print "la ligne %d commence par %s" % \
        (index, ligne[0:25])
     
    # avec une liste de nombre
    for index, nombre in enumerate(range(0, 16, 2)):
        print "%d * %d = %d \t\t %d^2 = %d" % \
        (index, nombre, index * nombre, nombre, nombre**2)
     
    # avec une liste de chaine
    for classement, groupe in enumerate(
    ['pantera', 'sepultura', 'machine head']):
        print "%s est numero %d" % \
        (groupe.center(16, " ").center(40,'*'), classement+1)
     
    # etc, etc, etc...
    Nous venons de créer une moyen de recuperer le nom des fichier et leur index.

    Reste à formater ces données et à les enregistrer dans un fichier.

    Deux possibilités:
    - Premierement, ta methode : parcourir l'iterateur, prendre un element, le formater dans une chaine, l'enregistrer, et recommencer à parcourir l'iterateur...
    - Deuxiemement, ma méthode: créer une chaîne avec les données formatées et l'enregistrer dans un fichier.

    Nous utilisons la deuxième solution, plus economique.
    Créer la chaine avec les données formatées se realise en deux temps:
    - génerer une nouvelle liste grâce à une list comprehension
    - joindre les élements de cette liste pour former une chaine.

    Pour génerer une nouvelle liste, nous utilisons une comprehension de liste, qui transforme notre liste en une autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> [nombre**2 for nombre in range(4)]
    [0, 1, 4, 9]
    >>> ["etape %d" % nombre for nombre in range(4)]
    ['etape 0', 'etape 1', 'etape 2', 'etape 3']
    avec enumerate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> ["l'element %d est %s" % (index, personne) for \
    ... index, personne in enumerate(['toto', 'tutu', 'titi'])]
    ["l'element 0 est toto", "l'element 1 est tutu", "l'element 2 est titi"]
    >>> ['%d\t%s' % (index, fichier) for index, fichier in enumerate(os.listdir('.'))]
    Créons une chaine à partir de cette liste en utilisant la méthode join:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> print "__*__*__".join(["element1", "element2", "element3"])
    element1__*__*__element2__*__*__element3
    >>> print "\n".join(["element1", "element2", "element3"])
    element1
    element2
    element3
    >>> print "\n".join(["%d\t :%s" % (index, fichier) 
    ... for index, fichier in enumerate(os.listdir('.'))])
    Il reste à ouvrir un fichier en écriture et écrire cette chaine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open('liste.txt', 'w').write(....)
    Voila, maintenant si tu as compris, tu peux utiliser ce bout de code.

    Bon python

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

Discussions similaires

  1. [DX9] [Debutant] Problème de transparence :(
    Par SekYo dans le forum DirectX
    Réponses: 5
    Dernier message: 10/09/2004, 14h19
  2. [Debutant] Problème de sécurité dans un applet
    Par peaceinpal dans le forum Applets
    Réponses: 3
    Dernier message: 09/09/2004, 20h56
  3. [debutant]Problèmes
    Par BibiGmi dans le forum OpenGL
    Réponses: 2
    Dernier message: 05/03/2004, 14h00
  4. [Debutant] Problème du linker [Dev-c++4]
    Par Macdir dans le forum Dev-C++
    Réponses: 3
    Dernier message: 30/05/2003, 20h50
  5. Problème de debutant
    Par FredALife dans le forum DirectX
    Réponses: 1
    Dernier message: 09/05/2003, 12h47

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