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 :

Supprimé des lignes d'un fichier contenu dans un autre fichier


Sujet :

Python

  1. #1
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut Supprimé des lignes d'un fichier contenu dans un autre fichier
    Bonjour à tous,

    J'ai un fichier A (fichier complet) et un fichier B contenant des lignes que je souhaite supprimer dans le fichier A.

    Alors voici comment je souhaite procéder mais je n'arrive pas à le coder à partir du point 3)

    1) Je lis la première ligne de mon fichier A
    2) Je lis la seconde ligne de mon fichier B
    3) Je compare la première ligne de mon fichier A à toutes les lignes de mon fichier B
    4) Si la ligne du fichier A n'a jamais été trouvée dans le fichier B Alors cela veux dire que la ligne ne doit pas être supprimé et peut donc être réécrite dans un fichier C

    Une idée ? Une autre manière de formuler le problème ?

    Voici le début du code que j'ai fait. Pour l'instant je ne lui demande pas d'écrire dans mon fichier C, juste de m'afficher les lignes qui devraient être supprimées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Fichier = open("MyFile.txt","r") #Fichier A
    Fichier_Suppr=open("Suppr.txt","r") #Fichier B
    for ligne in Fichier:
        for ligne_suppr in Fichier_Suppr:
            if ligne in ligne_suppr:
                print ligne_Suppr + "a été supprimée"
    Fichier.close()
    Fichier_Suppr.close()
    Voici mon fichier 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
     43,  7585, 40465, 40475,  7584,  7600, 40488, 40498,  7599
     44, 40474, 40473, 40465, 40458, 40497, 40496, 40488, 40481
     45,  7587, 40474, 40458,  7586,  7602, 40497, 40481,  7601
     46,  7537, 40474,  7587,   435,  7542, 40497,  7602,   436
     47, 40465,  7585,  7586, 40458, 40488,  7600,  7601, 40481
     48,  7582, 40460, 40466,  7581,  7597, 40483, 40489,  7596
     49, 40479, 40470, 40469, 40472, 40502, 40493, 40492, 40495
     50, 40457, 40463,  7579,  7580, 40480, 40486,  7594,  7595
     51, 40464,  7578,  7579, 40463, 40487,  7593,  7594, 40486
     52,  7536, 40473, 40474,  7537,  7541, 40496, 40497,  7542
     53, 40477,  7576,  7577, 40459, 40500,  7591,  7592, 40482
     54, 40475, 40465, 40473, 40462, 40498, 40488, 40496, 40485
     55,  7583, 40476, 40460,  7582,  7598, 40499, 40483,  7597
     56,  7534,  7533, 40479, 40472,  7539,  7538, 40502, 40495
     57, 40463, 40467, 40469, 40464, 40486, 40490, 40492, 40487
     58, 40476,  7583,  7584, 40475, 40499,  7598,  7599, 40498
     59, 40462,  7535, 40471, 40468, 40485,  7540, 40494, 40491
     60, 40460, 40476, 40468, 40466, 40483, 40499, 40491, 40489
     61, 40472, 40471,  7535,  7534, 40495, 40494,  7540,  7539
     62, 40479, 40478, 40461, 40470, 40502, 40501, 40484, 40493
     63, 40467, 40471, 40472, 40469, 40490, 40494, 40495, 40492
     64, 40473,  7536,  7535, 40462, 40496,  7541,  7540, 40485
     65, 40461,  7575,  7576, 40477, 40484,  7590,  7591, 40500
     66,  7533,   434,  7573, 40479,  7538,   433,  7588, 40502
     67,  7588,  7589, 40501, 40502,  7603,  7604, 40524, 40525
     68, 40498, 40485, 40491, 40499, 40521, 40508, 40514, 40522
     69, 40494, 40490, 40489, 40491, 40517, 40513, 40512, 40514
     70,  7595,  7596, 40489, 40480,  7610,  7611, 40512, 40503
     71,  7593, 40487, 40482,  7592,  7608, 40510, 40505,  7607
    Voici mon fichier B:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    43,  7585, 40465, 40475,  7584,  7600, 40488, 40498,  7599
     44, 40474, 40473, 40465, 40458, 40497, 40496, 40488, 40481
     54, 40475, 40465, 40473, 40462, 40498, 40488, 40496, 40485
    Merci de votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    Salut,

    la solution comme tu la vois pourrait fonctionner mais j'y vois un problème.
    la lecture d'un fichier sur un disque dur, c'est pas ce qu'on fait de plus rapide. alors plutôt que de retourner lire le fichier B pour chaque ligne du fichier A, moi je ferais plutôt comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    stocker les lignes du fichier A dans une liste A
    stocker les lignes du fichier B dans une liste B
    pour chaque ligne de la liste A
        si la ligne apparait dans la liste B
            supprimer la ligne de la liste A
    écrire la liste A dans le fichier A
    regarde un peu les méthodes readlines et writelines de la classe File, ça devrait te plaire.

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 885
    Points : 7 233
    Points
    7 233
    Par défaut
    J'ai un fichier A (fichier complet) et un fichier B contenant des lignes que je souhaite supprimer dans le fichier A.
    C'est toi qui a créé ces fichiers ou sont-ils générés automatiquement par un programme externe ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Oui mais A est potentiellement grand, et ça ne sert pas à grand chose de le stocker. Le plus simple est de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bLines = Lire les lignes du fichier B dans une liste
    Pour chaque ligne de A :
      Si cette ligne n'est pas dans bLines :
        Ecrire cette ligne dans C

  5. #5
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par Tryph Voir le message
    Salut,

    la solution comme tu la vois pourrait fonctionner mais j'y vois un problème.
    la lecture d'un fichier sur un disque dur, c'est pas ce qu'on fait de plus rapide. alors plutôt que de retourner lire le fichier B pour chaque ligne du fichier A, moi je ferais plutôt comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    stocker les lignes du fichier A dans une liste A
    stocker les lignes du fichier B dans une liste B
    pour chaque ligne de la liste A
        si la ligne apparait dans la liste B
            supprimer la ligne de la liste A
    écrire la liste A dans le fichier A
    regarde un peu les méthodes readlines et writelines de la classe File, ça devrait te plaire.
    Voilà ce que j'ai pondu comme code :

    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
    MyFileList=[]
    fichier = open("MyFile.txt","r")
     
    for ligne in fichier:
        ligne=ligne.replace(" ","")
        MyFileList.append(ligne)
        #print(MyFileList)
     
    SupprFileList=[]
    Suppr_File=open("Suppr.txt","r")
     
    for ligne in Suppr_File:
        ligne=ligne.replace(" ","")
        SupprFileList.append(ligne)
        #print(SupprFileList)
     
    New_List=[]
     
    for value in range(0, len(MyFileList),1):
        if MyFileList[value] in SupprFileList:
            LineToBeDeleted=str(MyFileList[value])
            print("Line deleted : "+LineToBeDeleted)
        else:
            New_List.append(MyFileList[value])
     
    print(New_List)
     
     
    fichier.close()
    Suppr_File.close()
    Pour l'instant je n'écrit pas le résultat dans mon fichier de sortie, mais la liste finale a l'air d'être correcte.

    C'est toi qui a créé ces fichiers ou sont-ils générés automatiquement par un programme externe ?
    Ils sont créés par un programme externe

    Oui mais A est potentiellement grand, et ça ne sert pas à grand chose de le stocker.
    Oui effectivement le fichier A peut être grand (plusieurs Mo). L'intérêt de ta solution c'est quoi ? temps de calcul moins long ?

    Encore merci

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 885
    Points : 7 233
    Points
    7 233
    Par défaut
    Oui effectivement le fichier A peut être grand (plusieurs Mo). L'intérêt de ta solution c'est quoi ? temps de calcul moins long ?
    Oui, et limite, j'ai remarqué qu'il n'y a que des lignes différentes dans ton fichier A, du coup je pense même que toutes les lignes stockées du fichier B peuvent sans risque être supprimée une fois découverte, afin de rendre le test des lignes A par rapport aux lignes B plus rapides.

    Maintenant un code simple doit le faire, pas besoin de se compliquer la vie, à moins d'avoir des problèmes de formatage entre lignes fichier A et fichier B

    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
    with open('A.txt', 'r') as a, open('B.txt', 'r') as b, open('C.txt', 'w') as c:
     
        lines = [line.strip('\n').strip() for line in b.readlines()]
     
        for line in a:
            l = line.strip()
            if l in lines:
                lines.remove(l)
            else:
                c.write(line)
     
    # Gestion des fichiers
    os.remove('A.txt')
    os.rename('C.txt', 'A.txt')
    os.remove('B.txt')
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Oui effectivement le fichier A peut être grand (plusieurs Mo). L'intérêt de ta solution c'est quoi ? temps de calcul moins long ?
    l'intérêt de pas stocker tout le contenu du fichier dans une liste avant de faire le traitement c'est de gagner de la RAM.
    Si le fichier ne fait que quelques Mo, je pense personnellement que vue les quantités de RAM qu'on a de nos jours, ça va pas mettre le PC à genou. par contre si le fichier peut faire quelques centaines (voire quelques dizaines) de Mo, ça peut être plus dérangeant.
    après si tu veux optimiser la conso mémoire, ça sera toujours mieux de ne pas charger tout le fichier A préalablement.

    pour le temps de calcul en revanche, ça me parait beaucoup moins évident.
    j'ai pas fait le test mais lire chaque ligne une à une, je pense ça veut dire faire un accès disque à chaque ligne et les accès disque sont lents. alors qu'une fois le fichiers chargé en RAM, on ne fait que des accès à la mémoire vive pour faire les traitements, ce qui peut être potentiellement plus rapide.

    mais pour être sûr, faudrait faire le test.


    pour le reste, pourquoi as-tu besoin d'enlever les espaces de chaque ligne? car dans le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ligne in fichier:
        ligne=ligne.replace(" ","")
        MyFileList.append(ligne)
    si tu omets la suppression des espaces, le résultat est exactement le même qu'un simple realines()


    edit:
    finalement, j'ai fait le test pour la rapidité d’exécution et c'est kif-kif avec les 2 méthodes (chargement du fichier en RAM ou non).
    chez moi et avec les 2 fichiers fournis, sur 100 000 itérations, les temps ne diffèrent que de quelques dixièmes de secondes et donnent l'avantage tantôt à méthode, tantôt à l'autre.
    ça serait intéressant de tester avec des fichiers plus gros:
    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
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
    import timeit
     
     
    def preload():
        list_A = None
        list_B = None
        list_C = []
        with open("file_A.txt", "r") as file_A, open("file_B.txt", "r") as file_B:
            list_A = [line.strip() for line in file_A.xreadlines()]
            list_B = [line.strip() for line in file_B.xreadlines()]
        for line in list_A:
            if line not in list_B:
                list_C.append(line + "\n")
        with open("rslt_preload.txt", "w") as rslt:
            rslt.writelines(list_C)
     
     
    def jit():
        list_B = None
        list_C = []
        with open("file_B.txt", "r") as file_B:
            list_B = [line.strip() for line in file_B.xreadlines()]
        with open("file_A.txt", "r") as file_A:
            for line in (line.strip() for line in file_A.xreadlines()):
                if line not in list_B:
                    list_C.append(line + "\n")
        with open("rslt_jit.txt", "w") as rslt:
            rslt.writelines(list_C)
     
     
    iter_nb = 100000
    timer_preload = timeit.Timer(stmt=preload,
                                 setup="print 'timing {} preload'".format(iter_nb))
    timer_jit = timeit.Timer(stmt=jit,
                                 setup="print 'timing {} jit'".format(iter_nb))
    print "{} s".format(timer_preload.timeit(iter_nb))
    print "{} s".format(timer_jit.timeit(iter_nb))

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Tryph Voir le message
    pour le temps de calcul en revanche, ça me parait beaucoup moins évident.
    j'ai pas fait le test mais lire chaque ligne une à une, je pense ça veut dire faire un accès disque à chaque ligne et les accès disque sont lents. alors qu'une fois le fichiers chargé en RAM, on ne fait que des accès à la mémoire vive pour faire les traitements, ce qui peut être potentiellement plus rapide.
    A priori, la lecture d'une ligne ne signifie pas un accès disque à chaque fois sauf si les routines IO de Python sont salement foutues : généralement, ces routines utilisent un buffer par handle et les réutilisent. Même si elle ne font pas ça, tous les disques actuels lisent par grosse plage et placent en cache les parties lues même si tu ne demandes qu'une toute petite partie. readLines est potentiellement plus efficace mais ça peut être partiellement compensé par des histoires de cache du processeur et de manque de localité de la liste de string.

    Citation Envoyé par Tryph Voir le message
    mais pour être sûr, faudrait faire le test.
    Certes !

    Franchement, je préfère gérer le cas potentiellement problématique (un très gros fichier A, demandant beaucoup d'allocation en RAM) plutôt que d'accélérer minusculement le cas d'un petit fichier A qui est déjà super rapide quelque soit la méthode.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Citation Envoyé par Jedai Voir le message
    A priori, la lecture d'une ligne ne signifie pas un accès disque à chaque fois sauf si les routines IO de Python sont salement foutues : généralement, ces routines utilisent un buffer par handle et les réutilisent. Même si elle ne font pas ça, tous les disques actuels lisent par grosse plage et placent en cache les parties lues même si tu ne demandes qu'une toute petite partie. readLines est potentiellement plus efficace mais ça peut être partiellement compensé par des histoires de cache du processeur et de manque de localité de la liste de string.
    Il n'y a pas que le disque. Il y a aussi le file-system qui "cache" un max.
    Sans côté les optimisations de chacun des composants pour les "readahead" lors des lectures séquentielles.

    Franchement, je préfère gérer le cas potentiellement problématique (un très gros fichier A, demandant beaucoup d'allocation en RAM) plutôt que d'accélérer minusculement le cas d'un petit fichier A qui est déjà super rapide quelque soit la méthode.
    Sur votre PC vous faites ce que bon vous semble. Mais les programmes Python tournent plutôt sur des serveurs.
    Dans ces environnements, la RAM utilisée pour stocker le ficher sera disputée aux autres processus système.
    Ca va paginer "plus" et "stresser" le sous système disque un max.
    Dans la vraie vie, il sera toujours préférable de lire par paquets. Ça passe par la gestion d'un CHUNK_SIZE qui ne change pas trop le design dans ce cas car Python permet de passer ce paramètre à f.read(...).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Il n'y a pas que le disque. Il y a aussi le file-system qui "cache" un max.
    Sans côté les optimisations de chacun des composants pour les "readahead" lors des lectures séquentielles.
    Oui, il y a du cache à tous les niveaux alors il est fort invraisemblable qu'il y ait un accès disque par readLine(). Selon toute vraisemblance, la différence de vitesse entre une lecture avec readLine() dans une boucle comparée à readLines() sera négligeable (si ce n'est légèrement favorable à la boucle pour un gros fichier et un système encombré).

    Citation Envoyé par wiztricks Voir le message
    Sur votre PC vous faites ce que bon vous semble. Mais les programmes Python tournent plutôt sur des serveurs.
    Dans ces environnements, la RAM utilisée pour stocker le ficher sera disputée aux autres processus système.
    Ca va paginer "plus" et "stresser" le sous système disque un max.
    Exactement, c'est pourquoi j'ai conseillé de ne plutôt lire le fichier A (potentiellement gros) que ligne à ligne tandis que le fichier B (normalement petit et dont la totalité est nécessaire pour vérifier chaque ligne de A) est chargé en mémoire.

    Citation Envoyé par wiztricks Voir le message
    Dans la vraie vie, il sera toujours préférable de lire par paquets. Ça passe par la gestion d'un CHUNK_SIZE qui ne change pas trop le design dans ce cas car Python permet de passer ce paramètre à f.read(...).
    Dans la vraie vie, et sauf pour les fichier binaires, il est rarement nécessaire de gérer soi-même la lecture par paquet puisque les couches inférieures gèrent ça très bien. Évidemment la donne change si les données sont potentiellement malicieuses, mais dans ce cas il est encore préférable de créer une interface spécifique qui lira par paquet et traitera correctement les cas exceptionnels plutôt que de se faire confiance pour faire ça proprement à la main à chaque fois.

  11. #11
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Avant tout merci de vos réponses.

    J'ai une question : à quoi sert le strip ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lines = [line.strip('\n').strip() for line in b.readlines()]
    J'ai fais des tests directement dans la console python mais je ne comprend pas exactement à quoi ça sert.

    pour le reste, pourquoi as-tu besoin d'enlever les espaces de chaque ligne? car dans le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ligne in fichier:
        ligne=ligne.replace(" ","")
        MyFileList.append(ligne)
    J'enlève les espaces pour être sur que les formats finaux des lignes lorsque je ferai la comparaison, soient identiques.

    si tu omets la suppression des espaces, le résultat est exactement le même qu'un simple realines()
    Je n'ai pas très bien compris la subtilité avec readlines().

    Encore merci

  12. #12
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Avant tout merci de vos réponses.

    J'ai une question : à quoi sert le strip ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lines = [line.strip('\n').strip() for line in b.readlines()]
    quand il est appelé sans argument, strip() renvoie la chaine amputée de ses éventuels caractères blancs (espaces, tabulations, sauts de ligne, ...) qui sont présent au début et à la fin.
    dans ce cas là, normalement le "strip('\n')" est inutile puisque "\n" est un caractère blanc et qu'il sera enlevé par le "strip()" sans argument.
    plus d'infos dans la doc

    Citation Envoyé par nekcorp Voir le message
    J'enlève les espaces pour être sur que les formats finaux des lignes lorsque je ferai la comparaison, soient identiques.
    Je n'ai pas très bien compris la subtilité avec readlines().
    ce que je voulais dire c'est que readlines te renvoie directement une liste des lignes du fichier et que si t'avais pas besoin d'enlever les espaces, tu pourrais avantageusement remplacer les 3 lignes par une instruction.

    ceci dit, c'est toujours faisable en une instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyFileList = [line.strip().replace(" ", "") for line in fichier.xreadlines()]

  13. #13
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    Juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 300
    Points : 413
    Points
    413
    Par défaut
    Solution simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    f_a=open('a.txt')
    f_b=open('b.txt')
    f_c=open('c.txt','a')
     
    a=f_a.read().split('\n')
    b=f_b.read().split('\n')#transformation du contenu brut en liste de lignes$
     
    f_a.close()
    f_b.close()
     
    for ligne in a :
        if not ligne in b : f_c.write(ligne+'\n')
     
    f_c.close()
    PS : c'est enlever "er"
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

Discussions similaires

  1. [XL-2010] Supprimer des lignes en fonction du contenu d'une cellule
    Par Ardiden31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/05/2015, 08h49
  2. Réponses: 1
    Dernier message: 03/04/2009, 18h23
  3. Réponses: 5
    Dernier message: 24/02/2009, 09h05
  4. Réponses: 1
    Dernier message: 28/03/2008, 21h37
  5. Importer le contenu un fichier xml dans un autre fichier xml
    Par gedeon555 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/07/2005, 11h49

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