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 :

Supprimer lignes en doubles


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 57
    Points
    57
    Par défaut Supprimer lignes en doubles
    Bonjour à tous,
    je souhaite supprimer les lignes en double dans un fichier y compris la ligne originale.

    Exemple:

    pommes
    bananes
    carottes
    fraises
    pommes
    carottes
    je veux en résultat:

    bananes
    fraises
    J'ai ce bout de code qui élimine les doublons mais je n'arrive pas à éliminer chaque ligne qui existe 2 fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    seen = set() # holds lines already seen
    outfile = open(outfilename, "w")
    for line in open(infilename, "r"):
        if line not in lines_seen: # not a duplicate
            outfile.write(line)
            lines_seen.add(line)
    outfile.close()
    Ce bout de code me donne:
    Pommes
    bananes
    carottes
    fraises
    Merci pour votre aide

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    (je mets de côté pour le moment le "problème" de la première ligne)

    Tu ne peux pas, de toute façon, commencer à écrire des lignes "à la volée" tant que tu n'as pas exploité (lu) l'intégralité de ton fichier en entrée : quand tu tombes sur une ligne qui n'est jamais apparue précédemment, rien ne te dit que tu ne vas pas la retrouver un petit peu plus loin.

    Donc, jette ton exemple de code : ce n'est pas avec une modification mineure que cela fonctionnera mieux.

    Selon la taille, importante ou non, de ton fichier en entrée, tu chargeras l'ensemble des lignes ou feras deux passes pour éliminer les doublons.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 472
    Points : 9 266
    Points
    9 266
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà un petit code un peu "rustique" qui a l'air de faire le boulot.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Python v2.7
     
    with open("fichier.txt", 'r') as fs:
        liste = fs.readlines()
     
    with open("fichiersansdoublon.txt", 'w') as fd:
        for ligne in liste:
            if liste.count(ligne)==1:
                fd.write(ligne)
    Avec le fichier de départ contenant:

    pommes
    bananes
    carottes
    fraises
    pommes
    carottes
    le fichier résultant "fichiersansdoublon.txt" affiche bien:

    bananes
    fraises
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Reste à traiter le "problème" de la première ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    aie
    banane
    pomme
    banane
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    plx@sony:~$ python doublons.py
    plx@sony:~$ more fichiersansdoublon.txt 
    aie
    pomme
    plx@sony:~$
    Aie
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Merci pour vos réponse.

    @tyrtamos: Ton petit bout de code à l'air de très bien fonctionner, c'est bien ce que je voulais.

    @plxpy: Je ne vois pas de quel "problème" de première ligne tu parles ...

  6. #6
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    c'est quoi, alors

    Citation Envoyé par doudoubens
    ... y compris la ligne originale
    tu parlais de quoi ???
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par plxpy Voir le message
    c'est quoi, alors



    tu parlais de quoi ???
    Ah! je me suis mal exprimé. Je voulais dire la ligne qui existe en double tout simplement. Contrairement à la fonction set() qui élimine que la ligne doublée , moi je voulais supprimer la ligne en question et son double également.

    Fraises
    Pommes
    Carottes
    Pommes
    pour avoir
    Fraises
    Carottes
    Merci pour vos réponses

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 051
    Points : 1 382
    Points
    1 382
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fichier = ['pomme','banane','pomme','cerise','raisin','banane']
    d = {}
    for i in fichier:
        d[i] = d.get(i,0)+1
     
    resultat = [i for i in d if d[i]==1]

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 472
    Points : 9 266
    Points
    9 266
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    @josmiley:

    Solution intéressante, car l'accès par dictionnaire est en général rapide grâce au hash code. Mais la solution proposée a un inconvénient: l'ordre des lignes du fichier d'origine n'est pas conservé.

    Il est possible que ça n'ait aucune importance dans le problème posé, mais s'il y en a une, il est facile de conserver l'ordre en utilisant un dictionnaire "OrderedDict" du module collections:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from collections import OrderedDict
     
    d = OrderedDict()
    # le reste du code est identique
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    @josmiley:

    Solution intéressante, car l'accès par dictionnaire est en général rapide grâce au hash code. Mais la solution proposée a un inconvénient: l'ordre des lignes du fichier d'origine n'est pas conservé.

    Il est possible que ça n'ait aucune importance dans le problème posé, mais s'il y en a une, il est facile de conserver l'ordre en utilisant un dictionnaire "OrderedDict" du module collections:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from collections import OrderedDict
     
    d = OrderedDict()
    # le reste du code est identique

    Effectivement l'ordre doit être conservé.

    Merci pour vos solutions

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Points : 426
    Points
    426
    Par défaut
    La solution de josmiley fonctionne si on ecrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fichier = ['pomme','banane','pomme','cerise','raisin','banane']
    d = {}
    for i in fichier:
        d[i] = d.get(i,0)+1
     
    resultat = [i for i in fichier if d[i]==1]
    for l in resultat: print(l)

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

Discussions similaires

  1. Supprimer lignes en double
    Par Oreo_ dans le forum SAS Base
    Réponses: 6
    Dernier message: 21/06/2013, 11h14
  2. Réponses: 14
    Dernier message: 22/09/2011, 16h11
  3. Supprimer les lignes en double
    Par illight dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 13/09/2007, 19h43
  4. Supprimer des lignes en double.
    Par Empty_body dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/06/2007, 14h45
  5. Supprimer ligne en double
    Par azman0101 dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/06/2004, 17h53

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