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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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

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