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 :

importer fichier pour travailler avec


Sujet :

Python

  1. #21
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Quelques précisions :

    Citation Envoyé par ju_bicycle Voir le message
    Si tu t'amuse a mettre des nom sur plusieurs lignes, n'oublie pas de mettre une boucle while pour tout lire.
    Il vaut mieux utiliser la méthode readlines, qui permet d'obtenir une liste dont chaque élément est une ligne du fichier.
    Par ailleurs, si on veut juste itérer sur un fichier, ligne par ligne, il vaut mieux ne rien utiliser du tout.
    Tout ceci présuppose que l'on ait une information (ici, un mot) par ligne.
    Je trouve que c'est le format de fichier le + pratique à utiliser, mais c'est juste mon opinion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    print open('fichier.txt').readlines()
     
    with open('fichier.txt') as f:
        for line in f:
            print line
    Citation Envoyé par ju_bicycle Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        #supression du caratere "fin de ligne" (\n)
        line_animaux=line_animaux[:-1]
        line_objets=line_objet[:-1]
    Ici, le risque est que line_animaux et line_objets n'ont pas forcément un caractère "fin de ligne".
    Le meilleur moyen de s'en débarasser est d'utiliser rstrip qui supprime des caractères à la fin d'une string si ces caractères existent.
    Par défaut, rstrip (et ses petits copains strip et lstrip) suppriment les espaces (dont fait partie le caractère "fin 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
    14
    15
    16
     
    In [107]: line = 'spam\n'
     
    In [108]: line
    Out[108]: 'spam\n'
     
    In [109]: line.rstrip()
    Out[109]: 'spam'
     
    In [110]: line2 = 'spam'
     
    In [111]: line2
    Out[111]: 'spam'
     
    In [112]: line2.rstrip()
    Out[112]: 'spam'
    Citation Envoyé par debutante en galere Voir le message
    Oui merci beaucoup d'avoir pris du temps pour m'expliquer.
    Super!
    Merci
    N'oublie pas le bouton "Résolu".

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    J'suis pas tout a fais d'accord avec la méthode readlineS...Mais la n'est pas le débat.

    Par contre

    ici, le risque est que line_animaux et line_objets n'ont pas forcément un caractère "fin de ligne".
    Le meilleur moyen de s'en débarasser est d'utiliser rstrip qui supprime des caractères à la fin d'une string si ces caractères existent.
    Par défaut, rstrip (et ses petits copains strip et lstrip) suppriment les espaces (dont fait partie le caractère "fin de ligne").
    Pas bête. j'avais completement oublié cette méthode. J'ajoute ca a ma boite a outils
    merci

  3. #23
    Membre Expert
    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
    Par défaut
    Vous vous enquiquinez avec les fins de ligne, à vouloir les enlever à coup de [:-1] ou de strip() , avant d’appliquer split() .

    Mais il ne faut pas oublier que split() , sans indication de séparateur selon lequel splitter, élimine les fins de ligne.

    str.split([sep[, maxsplit]])

    Return a list of the words in the string, using sep as the delimiter string.

    (....)

    If sep is given, ...

    (....)

    If sep is not specified or is None, a different splitting algorithm is applied: runs of consecutive whitespace are regarded as a single separator, and the result will contain no empty strings at the start or end if the string has leading or trailing whitespace.
    La liste des whitespace se trouve là:
    http://www.python.org/doc/2.5.4/lib/re-syntax.html
    [ \t\n\r\f\v]
    au caractère spécial \s





    D’autre part,

    ju_bicycle , ton code est bien pour une débutante, parce qu’il lui permet de bien voir les différentes étapes impliquées.

    Mais j’estime qu’il faut aussi lui indiquer que le code peut se condenser. La puissance de Python est destinée à faciliter les choses aux développeurs. Autant s’imprégner de cette idée dès le départ.

    Donc je reprendrais ton code en le condensant, compte tenu aussi de la remarque sur split() .

    Il me semble en outre inutile de créer une référence output avant de la retourner; ça consiste à creer un objet chaîne ('animal',’objet’ ou ’rien’), de lui coller une étiquette et de retourner l’objet. Mais l’étiquette étant une variable locale ne s’échappe pas de la fonction, donc à quoi sert elle puisque l’objet lui était antérieur ?

    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
    def Objet_ou_Animal(input)
        animaux=open('animaux.txt','r')
        objets=open('objet.txt','r')
     
        #Transformation en liste:
        liste_animaux = animaux.readline().split()
        liste_objet   = lobjets.readline().split()
     
        #On cherche si l'entrée de la fonction, cad la variable input est présente dans une des deux listes:
         if input in liste_animaux:
             print "C'est un animal"
             return 'animal'
     
         elif input in liste_objet:
             print "C'est un objet"
             return 'objet'
     
         else:
             print "Ni un objet, ni un animal"
             return 'rien'







    Pour “ débutante “ ,

    si tu souhaites enregistrer des données et en faire des interrogations par la suite, je te conseillerais d’aller voir les possibilités offertes par la Data Persistence, au lieu d’enregistrer les données dans des fichiers .txt, avec ces problèmes de fins de ligne et de lignes.

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

    Par exemple avec pickle ou cPickle, tu peux enregistrer une liste sous forme de liste, au lieu de sous forme de mots successifs qui doivent être réobtenus par splitting. La liste est enregistrée sous sa forme de liste par pickle.dump(liste,fichier) et on la recharge direct comme liste à partir de son enregistrement par pickle.load(fichier)

    Il y a aussi shelve et marshall, etc.

    Ça intimide un peu au début mais ces possibilités sont bêtes comme chou.

    Voici un petit code sur lequel réfléchir à tout ça.

    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
    51
    52
    53
    54
    ch = '''ouistiti koala raton chien\r
    termite fourmi abeille
    baleine cachalot phoque'''
     
    f = open('essai a effacer.txt','w')
    f.write(ch)
    f.close()
     
    g = open('essai a effacer.txt')
    gh = g.read()
    print repr(gh)
    g.close()
     
    print '----------------------------'
     
    g = open('essai a effacer.txt')
    li = g.read().split()
    g.close()
    print li
     
    print '----------------------------'
     
    from time import clock
     
    import cPickle
     
    te = clock()
    p = open('pic','w')
    cPickle.dump(li,p)
    p.close()
     
    q = open('pic')
    lu = cPickle.load(q)
    q.close()
    tf = clock()
     
    print 'lu =',lu
    print tf-te
     
     
    import pickle
     
    te = clock()
    p = open('pic','w')
    pickle.dump(li,p)
    p.close()
     
    q = open('pic')
    lu = pickle.load(q)
    q.close()
    tf = clock()
     
    print 'lu =',lu
    print tf-te
    On y vérifiera que cPickle est sur cet exemple 2 fois plus rapide que pickle.

  4. #24
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Vous vous enquiquinez avec les fins de ligne, à vouloir les enlever à coup de [:-1] ou de strip() , avant d’appliquer split() .

    Mais il ne faut pas oublier que split() , sans indication de séparateur selon lequel splitter, élimine les fins de ligne.
    Effectivement, mais si l'on passe par readlines ou l'itérateur de l'objet fichier, on n'utilise pas split et les caractères blancs sont conservés.
    Cela dit, je dois bien avouer que ça m'était complètement sorti de l'esprit.

    Citation Envoyé par eyquem Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #<snip!>
         if input in liste_animaux:
             print "C'est un animal"
             return 'animal'
     
         elif input in liste_objet:
             print "C'est un objet"
             return 'objet'
     
         else:
             print "Ni un objet, ni un animal"
             return 'rien'
    Juste pour pinailler, pas la peine de mettre elsif ou else après un return. Si on passe par le return, on sort direct de la fonction.

    On me crie dans l'oreillette que si l'on fait comme ça et que l'on vire + tard les return, le code devient totalement faux.
    Je répondrais qu'il faut un minimum de rigueur quand on modifie du code et que les tests unitaires servent à vérifier ça.

    Sinon, on peut toujours construire un dico avec comme clés les mots contenus dans les fichiers et comme valeurs soit "animal", soit "objet", suivant dans quel fichier se trouve le mot.
    Ca peut paraître + long comme ça, mais une fois le dico construit on doit gagner en vitesse (il me semble que l'accès à une clé d'un dico est + rapide que la vérification de l'appartenance d'un objet à une liste, mais c'est à vérifier).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    reference = dict()
    for nomdefichier, categorie in [('animaux.txt', 'animal'), ('objets.txt', 'objet')]:
        for mot in open(nomdefichier).readline().split():
            reference[mot] = categorie
    # On arretera la boucle avec un Ctrl-C.
    while True:
        input = raw_input('Entrez un mot : ')
        resultat = reference.get(input, None)
        if not resultat:
            print 'Ni un objet, ni un animal'
        else:
            print "C'est un", resultat
    On me dira que si un mot appartient aux 2 fichiers, on a un problème.
    Certes, mais c'est aussi le cas dans l'autre version.

    Citation Envoyé par eyquem Voir le message
    Pour “ débutante “ ,

    si tu souhaites enregistrer des données et en faire des interrogations par la suite, je te conseillerais d’aller voir les possibilités offertes par la Data Persistence, au lieu d’enregistrer les données dans des fichiers .txt, avec ces problèmes de fins de ligne et de lignes.
    Intéressant comme idée, mais impraticable si l'origine des données n'est pas Python.
    A moins de charger les fichiers une première fois et après d'utiliser la Data Persistence de Python... hmmm, je sens que je vais regarder ça ce soir.

  5. #25
    Membre Expert
    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
    Par défaut
    Effectivement, mais si l'on passe par readlines ou l'itérateur de l'objet fichier, on n'utilise pas split
    Oui, mais si on veut lister les mots de chaque ligne on sera bien obligé d’appliquer split() à chaque ligne.





    Juste pour pinailler, pas la peine de mettre elsif ou else après un return. Si on passe par le return, on sort direct de la fonction.
    OK

    On me crie dans l'oreillette que si l'on fait comme ça et que l'on vire + tard les return, le code devient totalement faux.
    Je répondrais qu'il faut un minimum de rigueur quand on modifie du code et que les tests unitaires servent à vérifier ça.
    Dans ce cas, je préfère garder elif et else, ça ne coûte pas plus cher.





    reference comme nom de dictionnaire, ce n’est vraiment pas terrible. C’est même à proscrire, puisque tous les noms de “variables“ en Python sont en réalité des références (= des étiquettes collées sur des objets).






    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for mot in open(nomdefichier).readline().split()
    ça c’est du condensé !

    On peut faire mieux. Ou pire selon certains.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    d = {}
    [ d.update(  (mot,categorie) for mot in open(nomdefichier).readline().split()  )
      for (nomdefichier, categorie) in [('animaux.txt','animal'),('objets.txt', 'objet')] ]


    cf aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d = dict(  (mot,'animal') for mot in open('animaux.txt').readline().split()  )
    qui crée aussi le dictionnaire.

  6. #26
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Oui, mais si on veut lister les mots de chaque ligne on sera bien obligé d’appliquer split() à chaque ligne.
    Effectivement, mais j'ai l'habitude de travailler avec des fichiers texte qui disposent d'une seule info (=mot dans le cas présent) par ligne.
    Faut croire que c'est juste une question de goût.

    Citation Envoyé par eyquem Voir le message
    Dans ce cas, je préfère garder elif et else, ça ne coûte pas plus cher.
    Pareil qu'au-dessus, question de goût.

    Citation Envoyé par eyquem Voir le message

    reference comme nom de dictionnaire, ce n’est vraiment pas terrible. C’est même à proscrire, puisque tous les noms de “variables“ en Python sont en réalité des références (= des étiquettes collées sur des objets).
    Je ne devais pas être inspiré.
    En même temps, ce n'est pas un mot réservé.
    Et, même si je comprends ton avis, je ne le partage pas : le fait que Python fasse de la référence d'objet ne me semble pas contre-indiquer l'utilisation du mot reference. Enfin, ça me choque pas (question de goût, ter).

    Citation Envoyé par eyquem Voir le message
    On peut faire mieux. Ou pire selon certains.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    d = {}
    [ d.update(  (mot,categorie) for mot in open(nomdefichier).readline().split()  )
      for (nomdefichier, categorie) in [('animaux.txt','animal'),('objets.txt', 'objet')] ]
    Terrible, l'utilisation de la compréhension de liste pour NE PAS construire de liste.
    J'avais pensé à ce d.update, mais dans une boucle, pas dans une compréhension de liste.
    Et je me suis dit que ça serait un peu trop condensé pour le coup (oui, je me suis restreint).
    Après, y'a aussi les compréhensions de dictionnaire dans Python3.

    Citation Envoyé par eyquem Voir le message
    cf aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d = dict(  (mot,'animal') for mot in open('animaux.txt').readline().split()  )
    qui crée aussi le dictionnaire.
    Une partie seulement, une partie.

  7. #27
    Membre Expert
    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
    Par défaut
    même si je comprends ton avis
    Tu ne devrais pas. Mon avis sur le mot reference est idiot.
    Il doit y avoir des tas de gens qui utilisent Python pour faire de la gestion de stock; on ne va pas leur dire de proscrire le mot reference comme nom de ... référence. Parce que si ce n’est pas un mot réservé, ce n’est pas pour rien: il n’y a aucune conséquence fâcheuse à utiliser ce mot, je n’en vois aucune. Je me range à ton avis.




    Terrible, l'utilisation de la compréhension de liste pour NE PAS construire de liste.
    Même si on n’utilise pas de list comprehension, il n’y a pas création de liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    d = {}
    for (nomdefichier, categorie) in [('animaux.txt','animal'),('objets.txt', 'objet')]:
        d.update(  (mot,categorie) for mot in open(nomdefichier).readline().split()  )
    La forme list comprehension est utilisée ici pour faire une action, tandis qu’habituellement la list comprension construit une liste c’est vrai.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [ d.update(  (mot,categorie) for mot in open(nomdefichier).readline().split()  )
      for (nomdefichier, categorie) in [('animaux.txt','animal'),('objets.txt', 'objet')] ]
    renvoie None, qui s’évapore dans la mémoire vive.

    Il reste le dictionnaire qui a été modifié par les instructions internes.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/08/2009, 01h51
  2. Réponses: 2
    Dernier message: 10/11/2006, 08h24
  3. [VBA] Requête + date pour travailler avec des recordsets
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 14/08/2006, 15h15
  4. Réponses: 8
    Dernier message: 22/11/2005, 07h29
  5. Réponses: 6
    Dernier message: 19/09/2005, 15h35

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