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 �clair� Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    F�vrier 2008
    Messages
    495
    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 : 495
    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 exp�riment� Avatar de zancrows
    Homme Profil pro
    �tudiant
    Inscrit en
    D�cembre 2016
    Messages
    159
    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 : 159
    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 �clair� 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
    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
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    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 �clair� Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    F�vrier 2008
    Messages
    495
    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 : 495
    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
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    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 �clair� 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
    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 �clair� Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    F�vrier 2008
    Messages
    495
    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 : 495
    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 �clair� 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
    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
    Membre averti
    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
    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
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par d�faut
    Quelle cl� utiliserais-tu pour ton dictionnaire ?

  12. #12
    Expert confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 094
    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 : 4 094
    Par d�faut
    On peut utiliser aussi cette m�thode...

  13. #13
    Membre �m�rite
    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
    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 �clair� Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    F�vrier 2008
    Messages
    495
    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 : 495
    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 �clair� Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    F�vrier 2008
    Messages
    495
    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 : 495
    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 confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 094
    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 : 4 094
    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

  17. #17
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 848
    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 848
    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 �clair� Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    F�vrier 2008
    Messages
    495
    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 : 495
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 848
    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 848
    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 �clair� Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    F�vrier 2008
    Messages
    495
    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 : 495
    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