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 :

comparer les lignes d'un fichier


Sujet :

Python

Vue hybride

smartmobili comparer les lignes d'un... 21/02/2010, 18h16
wiztricks os.sep est un caractère pas... 21/02/2010, 18h48
N.tox f=open(sys.argv[1], 'r') ... 21/02/2010, 18h55
wiztricks Ben oui, c'est du code... 21/02/2010, 19h03
PauseKawa 8O Du code bourrin de... 21/02/2010, 20h50
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Par défaut comparer les lignes d'un fichier
    Salut,
    J'essaye douleureusement de faire des trucs simples mais je ne suis pas compatible avec Python on dirait.
    Par exemple je veux afficher seulement les lignes qui finissent par / donc j'essaye ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    f=open(sys.argv[1], 'r')
     
    for line in f:
        if line.endswith('/'):
            print line,
     
    f.close()
    Mais ca ne fonctionne pas, une idée du pourquoi ?
    Mon but est de pouvoir a terme implémenter l'algo suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #   if line endswith "/" append line to dirstring
    #   else
    #     if (dirstring not empty)
    #           printf SetOutPath "$INSTDIR" . join(dirstring)
    #           dirstring=""
    #    else
    #           printf "File \"C:\GNUstep-devel\1.0.11\" line
    le but etant de générer une liste de fichiers compatible avec l'installeur opensource nsis qui a chaque fois qu'il y a un repertoire ajoute la chaine SetOutPath"$INSTDIR suivi du nom du repertoire s'il y en a un:

    SetOutPath "$INSTDIR\bin"
    File "C:\GNUstep-devel\1.0.11\bin\awk"
    ...
    SetOutPath "$INSTDIR\doc\msys"
    File "C:\GNUstep-devel\1.0.11\doc\msys\COPYING"
    ...
    SetOutPath "$INSTDIR\etc"
    File "C:\GNUstep-devel\1.0.11\etc\fstab.sample"
    ...
    SetOutPath "$INSTDIR"
    File "C:\GNUstep-devel\1.0.11\m.ico"
    ...

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut os.sep est un caractère pas une fonction
    Salut,

    A la base for line in f équivaut à lire f via realine.
    line contiendra toujours la fin de ligne (\n) et endswith('/') retournera False.

    Exemple de code un peu bourrin (qui marche):

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import sys, os
    with open(sys.argv[1]) as f:
        for line in f.read().splitlines():
            if line.endswith(os.sep):
                print '%s: is path' % line
            else: print 'line: ', line

    - W
    PS: Ah oui... os.sep = '/' sous Unix, '\' sous Windows.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre émérite
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    f=open(sys.argv[1], 'r')
     
    for line in f:
        if line.rstrip().endswith('/'):
            print line,
     
    f.close()
    Marche aussi, de façon moins agressive pour la mémoire

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Ben oui, c'est du code bourrin....
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ben oui, c'est du code bourrin....
    - W
    Du code bourrin de wiztricks ?!

    Moi je marque la page

    Pardon ? A oui ->[]

  6. #6
    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
    un perd tous, tous bourrins


    J’ai comparé plusieurs façons de faire le test sur un fichier des 250000 octets et 23469 lignes.

    En stockant y = os.sep en mémoire vive au lieu de le calculer à chaque tour,
    et en testant par if ln[-2:-1]==os.sep au lieu de faire if ln.endswith(os.sep) , on diminue le temps d’exécution de 12 %.



    Sur la base des temps minimaux trouvés lors de 1000 essais avec le code suivant, j’ai trouvé la hiérarchie de temps d’exécution suivante:

    if ln.endswith(os.sep)
    114,1


    if ln[-2:-1]==os.sep
    112,2


    y = os.sep
    if ln.endswith(y)
    103,5


    y = os.sep
    if ln[-2:-1]==y
    100



    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    from time import clock
    import os
     
    iterations = 10
     
    A,B,C,D = [],[],[],[]
    for i in xrange(iterations):
        if i%10==0:
            print i,
     
        f = open('abcd.txt')
        li = []
        te = clock()
        for ln in f:
            if ln.endswith(os.sep):
                li.append(repr(ln))
        tf = clock()
        A.append(tf-te)
        f.close()
     
        f = open('abcd.txt')
        li = []
        te =clock()
        for ln in f:
            if ln[-2:-1]==os.sep:
                li.append(repr(ln))
        tf = clock()
        B.append(tf-te)
        f.close()
     
        f = open('abcd.txt')
        li = []
        y = os.sep
        te = clock()
        for ln in f:
            if ln.endswith(y):
                li.append(repr(ln))
        tf = clock()
        C.append(tf-te)
        f.close()
     
        f = open('abcd.txt')
        li = []
        y = os.sep
        te =clock()
        for ln in f:
            if ln[-2:-1]==y:
                li.append(repr(ln))
        tf = clock()
        D.append(tf-te)
        f.close()
     
    print
    print min(A)
    print min(B)
    print min(C)
    print min(D)
    f = open('abcd.txt')
    i=0
    for ln in f:
        i+=1
    f.close()
    print i

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/11/2014, 15h36
  2. Comparer les lignes d'un fichier EXCEL
    Par eedas dans le forum Excel
    Réponses: 5
    Dernier message: 10/11/2013, 15h15
  3. Comparer les lignes d'un fichier .csv
    Par mario3979 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 05/06/2012, 14h08
  4. Comparer les lignes d'un fichier txt
    Par Casimir* dans le forum VBScript
    Réponses: 3
    Dernier message: 28/08/2007, 15h12
  5. Réponses: 3
    Dernier message: 26/04/2004, 12h51

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