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 :

lire un fichier


Sujet :

Python

  1. #1
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut lire un fichier
    voici une code des plus 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
     #lecture
     
     
    lire_fic1 = open("Requete_f1.csv", "r") 
    destination = open("Requete_f1.new.csv", "w")
     
    try:
        for ligne_1 in lire_fic1:
            lire_fic2 = open("Requete_f2.csv", "r")
            for ligne_2 in lire_fic2:
                if ligne_1 == ligne_2:
                    doublon = 'o'
                    break
                else:
                     doublon = 'n'
            lire_fic2.close()
            if doublon == 'n':
                destination.write(ligne_1)  
     
    finally:
     
        destination.close()
        lire_fic1.close()
    je rouille ma logique fou le camp.

    Je veux comparer Requete_f1.csv et Requete_f2.csv le contenu des fichiers a des similitudes.
    il peut exister des lignes strictement identique entre f1 et f2
    donc je cherche a obtenir un nouveau fichier f1 ou les donnée similaire à f2 n'existe pas.

  2. #2
    Membre averti Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 155
    Points : 346
    Points
    346
    Par défaut
    Salut

    ce que tu cherches c'est que par exemple tu as une liste 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    bonjour
    aurevoir
    salut
    hello
    goudbye
    liste 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    bonjour
    ohayo
    salut
    ia ora na
    adios
    et que ca te sorte en destination
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    aurevoir
    hello
    goudbye
    ?

  3. #3
    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 dedalios Voir le message
    voici une code des plus 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
     #lecture
     
     
    lire_fic1 = open("Requete_f1.csv", "r") 
    destination = open("Requete_f1.new.csv", "w")
     
    try:
        for ligne_1 in lire_fic1:
            lire_fic2 = open("Requete_f2.csv", "r")
            for ligne_2 in lire_fic2:
                if ligne_1 == ligne_2:
                    doublon = 'o'
                    break
                else:
                     doublon = 'n'
            lire_fic2.close()
            if doublon == 'n':
                destination.write(ligne_1)  
     
    finally:
     
        destination.close()
        lire_fic1.close()
    je rouille ma logique fou le camp.

    Je veux comparer Requete_f1.csv et Requete_f2.csv le contenu des fichiers a des similitudes.
    il peut exister des lignes strictement identique entre f1 et f2
    donc je cherche a obtenir un nouveau fichier f1 ou les donnée similaire à f2 n'existe pas.
    Salut,

    Ne sachant pas la taille, ni le contenu de tes fichiers je vais te faire une proposition mais il existe plusieurs façons de faire.

    Pourquoi dans une premier temps tu ne lirais pas le fichier Requete_f2.csv, tu met chaque lignes dans une liste que t'appelles List_Requete_f2

    Ensuite tu parcours ton fichier Requete_f1.csv et pour chaque lignes tu vérifies si elle est dans la List_Requete_f2 ou pas. Si elle y est tu ne l'écris pas dans ton fichier de sortie, si elle ni est pas et bien tu la copie.

    Ce qui ne va pas dans ta solution c'est que si des données identiques ne sont pas à la même position dans le fichier, alors il n'est pas possible de comparer deux lignes qui seront identiques, où alors il faudrait pour chaque lignes de f1 parcourir toutes les lignes de f2. Je te laisses imaginer le temps d'exécution du code sur des fichiers de plusieurs milliers de lignes.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Si tes fichiers ne sont pas trop gros, tu peux lire leur contenu en intégralité et en obtenir des listes. Il te suffit alors de faire une petite list comprehension pour obtenir les lignes qui sont dans un fichier mais pas dans l'autre.

    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with open("reference.txt") as reference, open("actual.txt") as actual:
        # Read files entirely
        content_reference = reference.readlines()
        content_actual = actual.readlines()
     
        # Compute lines that are in actual but not in reference
        content_diff = [line for line in content_actual if line not in content_reference]
     
        # Save differences
        print(content_diff)

  5. #5
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut solution N°1
    Citation Envoyé par nekcorp Voir le message
    Salut,

    Ne sachant pas la taille, ni le contenu de tes fichiers je vais te faire une proposition mais il existe plusieurs façons de faire.

    Pourquoi dans une premier temps tu ne lirais pas le fichier Requete_f2.csv, tu met chaque lignes dans une liste que t'appelles List_Requete_f2

    Ensuite tu parcours ton fichier Requete_f1.csv et pour chaque lignes tu vérifies si elle est dans la List_Requete_f2 ou pas. Si elle y est tu ne l'écris pas dans ton fichier de sortie, si elle ni est pas et bien tu la copie.

    Ce qui ne va pas dans ta solution c'est que si des données identiques ne sont pas à la même position dans le fichier, alors il n'est pas possible de comparer deux lignes qui seront identiques, où alors il faudrait pour chaque lignes de f1 parcourir toutes les lignes de f2. Je te laisses imaginer le temps d'exécution du code sur des fichiers de plusieurs milliers de lignes.


    Chaque fichier faite 5 Mo. 45000 lignes par fichier
    La structure et la position des données est identiques .

    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
     
    destination = open("f1.new.csv", "w")
    try:
        with open("f1ori.csv") as reference, open("f2.csv") as actual:
            #   affecte dans une liste de lignes la totalité du fichier.
            content_reference = reference.readlines()
            content_actual = actual.readlines()
     
     
     
            # comparer les lignes entre deux contenants
            content_diff = [line for line in content_actual if line not in content_reference]
     
            # enregistre les differences
            print(content_diff)
            destination.writelines(content_diff) 
     
    finally:
        destination.close()
    Mon fichier de sortie n'est pas ce que j'attends réellement. Je ne cherche que les informations de f1ori.csv .

    en changeant ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       content_diff = [line for line in content_reference  if line not in  content_actual]
    le fichier est vide

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Si on n'est bien d'accord que tu compares des lignes entières, alors la compréhension de liste est bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    content_diff = [line for line in content_actual if line not in content_reference]
    Tu prends les lignes de "actual" qui ne sont pas dans "reference".

    donc je cherche a obtenir un nouveau fichier f1 ou les donnée similaire à f2 n'existe pas.
    Ainsi, f1 est ce que j'appelle "actual" (ce que tu as vraiment) et f2 est "reference" (ce que tu t'attendais à avoir).

    Je ne cherche que les informations de f1ori.csv
    En fait, f1ori.csv est ton "actual".

    Plutôt que d'inverse les variables de la compréhension de liste, ne penses-tu pas qu'il serait plus simple de modifier les noms que tu associes aux retours de open() ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with open("f1ori.csv") as actual, open("f2.csv") as reference:
    Enfin, pourquoi garder ton try / catch plutôt que de mettre un 3e open() dans la ligne avec with ?

  7. #7
    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
    Mon fichier de sortie n'est pas ce que j'attends réellement. Je ne cherche que les informations de f1ori.csv .
    Vous n'avez pas compris le code que vous a fourni Bktero, vous l'avez simplement copié et testé et vous vous rendez compte que ça ne correspond pas à ce que vous vouliez obtenir.

    Qu'obtenez vous ? Que voulez vous obtenir réellement ?


    Que se passe t-il si vous écrivez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    content_diff = [line for line in content_reference if line not in content_actual]
    à la place de cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    content_diff = [line for line in content_actual if line not in content_reference]

  8. #8
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut ce que je cherche
    Je recherche a supprimer du fichier f1ori.csv les lignes totalement identiques contenu dans le f2.csv.

    Les données lignes a lignes ont les mème structures

  9. #9
    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 dedalios Voir le message
    Je recherche a supprimer du fichier f1ori.csv les lignes totalement identiques contenu dans le f2.csv.

    Les données lignes a lignes ont les mème structures
    Afin que l'on vous aide il faudrait que l'on puisse voir que vous cherchez de votre coté également et que vous n'attendez pas la solution toute prête.

    Personnes où alors très rarement quelqu'un vous donnera un code tout fait pour votre problème.

    Un code vous a pourtant été fourni par Bktero vous l'avez testé tel quel en inversant deux termes. Je vous ai demandé qu'est ce qui se passe avec cette modification, vous n'avez pas répondu.

    Si vous aviez au moins prit la peine de comparer les résultats en utilisant les deux lignes ci dessous vous auriez certainement eu la réponse à votre problème.


    Que se passe t-il si vous écrivez ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    content_diff = [line for line in content_reference if line not in content_actual]
    à la place de cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    content_diff = [line for line in content_actual if line not in content_reference]

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pologne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2016
    Messages : 26
    Points : 28
    Points
    28
    Par défaut
    A mon avis, plutot que d'utiliser des listes, il serait preferable de faire appel a des dictionnaires.
    Le temps de recherche pour une liste de n elements peut etre de O(n) alors qu'une recherche dans un dictionnaire se fait toujours en O(1)

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Quelle clé utiliserais-tu pour ton dictionnaire ?

  12. #12
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    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 817
    Points : 7 110
    Points
    7 110
    Par défaut
    On peut utiliser aussi cette méthode...
    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)

  13. #13
    Membre éclairé
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Points : 752
    Points
    752
    Par défaut
    Si l'ordre n'est pas important, il est possible d'utiliser les opérations ensemblistes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    with open("reference.txt") as reference, open("actual.txt") as actual:
        content_reference = reference.readlines()
        content_actual = actual.readlines()
     
        # Elements of actual that are not in reference
        content_diff = set(content_actual) - set(content_reference) 
        # Si l'ordre importe, on peut réitérer sur le tableau d'origine
        # la véfification dans un set est en O(1)
        # content_diff = [line for line in content_actual if line in content_diff]
     
    with open("new.txt", "w") as out:
        out.write("\n".join(content_diff))

  14. #14
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut
    Un code vous a pourtant été fourni par Bktero vous l'avez testé tel quel en inversant deux termes. Je vous ai demandé qu'est ce qui se passe avec cette modification, vous n'avez pas répondu.
    .
    J'ai testé le code de Bktero à l'identique et je me suis rendu compte que le résultat ne correspondait pas à mon but.

    Afin de mieux comprendre le code j'ai donc modifier l'ordre du process de trie proposé et la résultat fut vide.

    j'ai inversé le nom de fichier

    Je recherche a supprimer du fichier f1ori.csv les lignes totalement identiques contenu dans le f2.csv.

    ma version test le 19/07/2017
    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
    destination = open("Resultat.csv", "w")
    try:
        with open("f1ori.csv") as reference, open("f2.csv") as actual:
            # Read files entirely
            content_reference = reference.readlines()
            content_actual = actual.readlines()
     
            # comparer les lignes entre deux contenants
            content_diff = [line for line in content_actual  if line not in  content_reference]
            # Tu prends les lignes de "actual" qui ne sont pas dans "reference".
            # enregistre les differences
            #print(content_diff) 
            destination.writelines(content_diff) 
     
    finally:
        destination.close()
    Le résultat n'es't pas ce que j'attend

    J'ai donc modifier
    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
    destination = open("resultat.csv", "w")
    try:
        with open("f1ori.csv") as actual, open("f2.csv") as reference:
            # Read files entirely
            content_reference = reference.readlines()
            content_actual = actual.readlines()
     
            # comparer les lignes entre deux contenants
            content_diff = [line for line in content_actual  if line not in  content_reference]
            # Tu prends les lignes de "actual" qui ne sont pas dans "reference".
            # enregistre les differences
            #print(content_diff) 
            destination.writelines(content_diff) 
     
    finally:
        destination.close()
    le fichier resultat.csv est vide ce qui ne me semble pas logique en soit






    autres modèles de 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
    lire_fic1 = open("f1ori.csv", "r") 
    destination = open("Resultat.csv", "w")
     
    try:
        for ligne_1 in lire_fic1:
            lire_fic2 = open("f2.csv", "r")
            #print('ligne_1')
            for ligne_2 in lire_fic2:
                #print(ligne_2)
                if ligne_1 == ligne_2:
                    doublon = 'o'
                    break
                else:
                     doublon = 'n'
            lire_fic2.close()
            if doublon == 'n':
                print('ecriture')
                #print(ligne_1)
                destination.write(ligne_1)  
     
    finally:
     
        destination.close()
        lire_fic1.close()
     
        # Fermeture des fichiers en lecture
    résultat vide

  15. #15
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par Alexis.M Voir le message
    Si l'ordre n'est pas important, il est possible d'utiliser les opérations ensemblistes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    with open("reference.txt") as reference, open("actual.txt") as actual:
        content_reference = reference.readlines()
        content_actual = actual.readlines()
     
        # Elements of actual that are not in reference
        content_diff = set(content_actual) - set(content_reference) 
        # Si l'ordre importe, on peut réitérer sur le tableau d'origine
        # la véfification dans un set est en O(1)
        # content_diff = [line for line in content_actual if line in content_diff]
     
    with open("new.txt", "w") as out:
        out.write("\n".join(content_diff))
    Le résultat est assez étrange
    reference.txt :433ko
    actual.txt:5842ko
    new.txt4686ko

    De surcroit le fichier new.txt contient \n de trop il suffit alors de modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open("new.txt", "w") as out:
        out.write("\n".join(content_diff))
    j'ai inverse les fichiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     with open("actual.txt") as reference, open("reference.txt") as actual:
    résultat vide . opération ensembliste au résultat des plus étrange ...

  16. #16
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    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 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Citation Envoyé par Alexis.M Voir le message
    Si l'ordre n'est pas important, il est possible d'utiliser les opérations ensemblistes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    with open("reference.txt") as reference, open("actual.txt") as actual:
        content_reference = reference.readlines()
        content_actual = actual.readlines()
     
        # Elements of actual that are not in reference
        content_diff = set(content_actual) - set(content_reference) 
        # Si l'ordre importe, on peut réitérer sur le tableau d'origine
        # la véfification dans un set est en O(1)
        # content_diff = [line for line in content_actual if line in content_diff]
     
    with open("new.txt", "w") as out:
        out.write("\n".join(content_diff))
    Oui c'est la solution que je propose, voir au niveau du temps de réponse si ça convient
    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)

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour

    On peut remplacer la comprehension list de Bktero par ceci: content_diff = set(content_actual) - set(content_reference).

    Citation Envoyé par dedalios Voir le message
    j'ai inverse les fichiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     with open("actual.txt") as reference, open("reference.txt") as actual:
    résultat vide . opération ensembliste au résultat des plus étrange ...
    Oui, que tu inverses les noms des variables ou (ou exclusif !!!) l'association des open donnera le même résultat. Mais inverser l'association des open aura au-moins le mérite de respecter la logique de Bktero dans laquelle le token "content_reference" sert de référence à la recherche. Ce qui me laisse d'ailleurs perplexe sur ta propre logique concernant les noms de tes fichiers...

    Donc déjà la première fois que tu as eu le résultat vide tu aurais dû te poser la question (au lieu de nous la poser) pour ensuite te mettre à chercher. Parce que ça, personne ne peut le faire à ta place. Donc ouvrir ton premier fichier, ouvrir ton second, regarder visuellement ce qui peut cafouiller. Si t'es sous Linux, l'outil "meld" te sera d'une grande aide (il fait exactement ce travail: il ouvre les deux fichiers en parallèle et surligne les lignes de l'un qui ne sont pas dans l'autre) et si meld n'est pas installé (ce qui peut arriver sur des distributions comme "Debian" qui laissent beaucoup plus de choix à l'installation) alors t'as au-moins l'outil "diff" qui fait la même chose mais qui liste les différences au-lieu de les afficher en plein écran.
    Pour moi, il n'y a rien d'étrange au fichier vide. Si c'est vide ça veut dire que toutes les lignes du fichier à traiter sont présentes dans le fichier de référence.

    Pour info, un test fait à partir de l'exemple de zancrows
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a=["bonjour", "aurevoir", "salut", "hello", "goudbye"]
    >>> b=["bonjour", "ohayo", "salut", "ia ora na", "adios"]
    >>> [x for x in a if x not in b]
    ['aurevoir', 'hello', 'goudbye']
    >>> [x for x in b if x not in a]
    ['ohayo', 'ia ora na', 'adios']

    @Bktero: merci pour m'avoir montré le double open dans le with. Jusque là je mettais deux with imbriqués
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  18. #18
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut AFF
    Citation Envoyé par Sve@r Voir le message

    Pour info, un test fait à partir de l'exemple de zancrows
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a=["bonjour", "aurevoir", "salut", "hello", "goudbye"]
    >>> b=["bonjour", "ohayo", "salut", "ia ora na", "adios"]
    >>> [x for x in a if x not in b]
    ['aurevoir', 'hello', 'goudbye']
    >>> [x for x in b if x not in a]
    ['ohayo', 'ia ora na', 'adios']
    je vais faire un test avec des fichiers plus petit car

    a=["bonjour", "aurevoir", "salut", "hello", "goudbye"]
    b=["bonjour", "ohayo", "salut", "ia ora na", "adios"]
    que ce soit cette opération ensembliste
    [x for x in a if x not in b]
    ---------> ['aurevoir', 'hello', 'goudbye'
    ou celle-ci [x for x in b if x not in a]

    il s’avère que cela n'est pas la méthode a appliquer pour le but auquel je veux arrivé

    fichiera fichierb Resultat Attendu
    a=["bonjour", "aurevoir", "salut", "hello", "goudbye"] b=["bonjour", "aurevoir", "salut", "hello", "goudbye"] Pas d'enregistrement
    a=["POMME", "POIRRE", "SIROT", "melange", "gateau"] b=["bonjour", "ohayo", "salut", "ia ora na", "adios"] ["POMME", "POIRRE", "SIROT", "melange", "gateau"]
    a=["bonjour", "ohayo", "salut", "ia ora na", "adios"] b=["bonjour", "ohayo", "salut", "ia ora na", "adios"] Pas d'enregistrement
    a=["VESTE", "CHEMISE", "PANTALON", "CHAUSETTE", "Chaussure" b=["Veste", "Chemisier", "Jupe", "sockette", "escarpin"] ["VESTE", "CHEMISE", "PANTALON", "CHAUSETTE", "Chaussure"]
    ceci dit j'ai découvert des opérateur ensembliste sur les données de type liste interessant


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [x for x in a if x not in b]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     content_diff = set(content_actual) - set(content_reference)





    Citation Envoyé par Sve@r Voir le message
    @Bktero: merci pour m'avoir montré le double open dans le with. Jusque là je mettais deux with imbriqués
    Une question concernant le multi open.
    Dans l'exemple, il n'y a aucun close de fichier, est-ce que celui-ci est implicite ou serait-il judicieux de l'ajouter en fin de code?

  19. #19
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Citation Envoyé par dedalios Voir le message
    donc je cherche a obtenir un nouveau fichier f1 ou les donnée similaire à f2 n'existe pas.
    il s’avère que cela n'est pas la méthode a appliquer pour le but auquel je veux arrivé
    Alors c'est que tu as mal exprimé ton besoin initial...

    Citation Envoyé par dedalios Voir le message
    fichiera fichierb Resultat Attendu
    a=["bonjour", "aurevoir", "salut", "hello", "goudbye"] b=["bonjour", "aurevoir", "salut", "hello", "goudbye"] Pas d'enregistrement
    a=["POMME", "POIRRE", "SIROT", "melange", "gateau"] b=["bonjour", "ohayo", "salut", "ia ora na", "adios"] ["POMME", "POIRRE", "SIROT", "melange", "gateau"]
    a=["bonjour", "ohayo", "salut", "ia ora na", "adios"] b=["bonjour", "ohayo", "salut", "ia ora na", "adios"] Pas d'enregistrement
    a=["VESTE", "CHEMISE", "PANTALON", "CHAUSETTE", "Chaussure" b=["Veste", "Chemisier", "Jupe", "sockette", "escarpin"] ["VESTE", "CHEMISE", "PANTALON", "CHAUSETTE", "Chaussure"]
    Il me semble, à première vue, que les méthodes proposées donnent le résultat attendu (avec une petite bémol vis à vis du "set" car dans le dernier cas, ça me donne ['Chaussure', 'VESTE', 'CHEMISE', 'CHAUSETTE', 'PANTALON'] (ordre différent que celui attendu)...

    Citation Envoyé par dedalios Voir le message
    Une question concernant le multi open.
    Dans l'exemple, il n'y a aucun close de fichier, est-ce que celui-ci est implicite ou serait-il judicieux de l'ajouter en fin de code?
    En fait ce n'est pas le multi-open qui est intéressant ici mais le "with" (ce qu'on nomme généralement les "context manager") car avec un with, tout le contexte qui est consommé dans l'instruction elle-même est automatiquement rendu quand le bloc se termine. Donc ici les fichiers ouverts sont automatiquement fermés.

    Et tu peux-même programmer tes propres context-manager toi-même. Exemple

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import os
     
    class cwd(objet):
        def __init__(dirname):
            self.__dirname = dirname
        def __enter__(self):
            self.__curdir = os.getcwd()
            os.chdir(self.__dirname)
        def __exit__(self, type, value, traceback):
            os.chdir(self.__curdir)

    Donc quand tu appelles "cwd" avec un "with", il commence par exécuter le "__init__" qui mémorise le répertoire courant. Puis il appelle le "__enter__" et ça te déplace là où tu le demandes. Et quand le bloc se termine, il appelle le "__exit__" qui te replace dans ton dossier d'origine.

    Et ça s'exécute ainsi
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # Je suis dans /home/machin
    print os.getcwd()
     
    with cwd("/tmp"):
        # Ici je suis dans "/tmp"
        print "with1 ", os.getcwd()
     
        with cwd("/var"):
            # Ici je suis dans "/var"
            print "with2, "os.getcwd()
        # Fin de with2 - Je me retrouve dans /tmp
        print "with1 ", os.getcwd()
    # Fin de with1 - Je me retrouve dans /home/machin
    print os.getcwd()

    Et si tu veux récupérer le contexte alloué via le mot clef "as" (comme dans with open(...) as f) alors il te faut retourner ce contexte dans le "__enter__".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  20. #20
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut

    Ma demande d'origine



    Je veux comparer fichiera.csv et fichierb.csv le contenu peut être identique pour une ligne donnée
    Donc je cherche a obtenir un nouveau fichier f1 ou les donnée de f1 similaire à f2 ligne par ligne n'existe pas

    Un exemple


    fichiera fichierb Resultat Attendu
    a=["bonjour", "aurevoir", "salut", "hello", "goudbye"] b=["bonjour", "aurevoir", "salut", "hello", "goudbye"] Pas d'enregistrement
    a=["POMME", "POIRRE", "SIROT", "melange", "gateau"] b=["bonjour", "ohayo", "salut", "ia ora na", "adios"] ["POMME", "POIRRE", "SIROT", "melange", "gateau"]
    a=["bonjour", "ohayo", "salut", "ia ora na", "adios"] b=["bonjour", "ohayo", "salut", "ia ora na", "adios"] Pas d'enregistrement
    a=["VESTE", "CHEMISE", "PANTALON", "CHAUSETTE", "Chaussure" b=["Veste", "Chemisier", "Jupe", "sockette", "escarpin"] ["VESTE", "CHEMISE", "PANTALON", "CHAUSETTE", "Chaussure"]


    mon code au départ est celui-ci et ma demande est quelle est l'erreur de logique dans ce code qui pause problème , le résultat finale est vide


    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
    lire_fic1 = open("fichiera.csv", "r") 
    destination = open("Resultat.csv", "w")
     
    try:
        for ligne_1 in lire_fic1:
            lire_fic2 = open("fichierb.csv", "r")
            for ligne_2 in lire_fic2:
                if ligne_1 == ligne_2:
                    doublon = 'o'
                    break
                else:
                     doublon = 'n'
            lire_fic2.close()
            if doublon == 'n':
                destination.write(ligne_1)  
     
    finally:
     
        destination.close()
        lire_fic1.close()
    Il existe visiblement une erreur de logique dans ce code mais je ne la vois pas .il est certain que le temps de traitement est relativement long mais quelle importance?
    Déconcertant du résultat est un fichier plus gros que le fichier d'origine.
    Comme si maigres l’indentation , l’écriture de la ligne lu dans le fichiera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            if doublon == 'n':
                destination.write(ligne_1)
    semble être réalisée non pour chaque ligne lu dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for ligne_1 in lire_fic1:
    mais bien plus souvent.


    Pour un fichiera de 3200 lignes

    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
     #lecture
     # -*- coding: cp1252 -*-
    indlu = 0
    indec = 0
    lire_fic1 = open("fichiera.csv", "r") 
    destination = open("Resultat.csv", "w")
    doublon = 'n' # pas de double dans le fichier par defaut
    try:
        for ligne_1 in lire_fic1:
            indlu +=1
            print(" lecture :")
            print(indlu)
            lire_fic2 = open("fichierb.csv", "r")
            for ligne_2 in lire_fic2:
                if ligne_1 == ligne_2:
                    doublon = 'o'
                    break
                else:
                     doublon = 'n'
            lire_fic2.close()
            if doublon == 'n':
                destination.write(ligne_1)
     
                print("           Ecriture :")
                indec +=1
                print(indec)
     
    finally:
     
        destination.close()
        lire_fic1.close()
    A la fin du traitement

    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
     lecture :
    43147
               Ecriture :
    39865
     lecture :
    43148
               Ecriture :
    39866
     lecture :
    43149
               Ecriture :
    39867
     lecture :
    43150
               Ecriture :
    39868
    donc sans aller vers les notions fort intéressante de liste et d'appel au objet liste au départ mon souhaite était que l'on m'aide dans l'erreur sur la logique de du code

Discussions similaires

  1. [Servlet][EJB]lire un fichier à partir de mon bean
    Par kimausoleil dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/02/2004, 14h26
  2. [MFC] lire un fichier en int
    Par Kevgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 09h32
  3. Réponses: 5
    Dernier message: 11/01/2004, 20h17
  4. Lire un fichier de 50 gb
    Par Maryves dans le forum MFC
    Réponses: 2
    Dernier message: 08/01/2004, 14h08
  5. Lire le fichier du port série
    Par saibe dans le forum Linux
    Réponses: 7
    Dernier message: 09/04/2003, 09h29

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