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 :

Repartir au début d'un fichier CSV


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 27
    Par défaut Repartir au début d'un fichier CSV
    salut,

    J'ai un petit soucis de fichier CSV. Je parcours un fichier CSV en faisant des tests puis je veux le remettre au debut. Je pensais qu'il fallait utiliser seek(0) mais j'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: '_csv.reader' object has no attribute 'seek'
    voilà mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
        def test( self, event ):#fonction d'un de mes bouton
     
            # Compare les Deux fichiers ligne par ligne
            error = True
            while error==True:
                try:
                    line1 = self.fichier1.next()
                    line2 = self.fichier2.next()
                    error = (line1==line2)
     
                except StopIteration:
                    break
            if error == True:
                print "Les Documents sont identiques"
            else:
                print "Les Documents sont différents"
     
     
     
            self.fichier1.seek(0) #remet le curseur au debut du fichier
            self.fichier2.seek(0)
     
            #Ensuite je fais d'autre truc sans intérêt pour le problème que j'ai
     
     
            event.Skip()
    Je comprend pas

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 27
    Par défaut
    Aprés réfléxion je me demande si l'erreur ne viendrai pas du fait que je ne fait pas le .seek(0) directement sur le fichier ? car self.fichier1 est une variable qui contien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.fichier1 = csv.reader(open(mon_fichier.csv,"rb"), delimiter=';')

    Donc je pense qu'il faut que je reformule ma question :

    Comment on revient au début de ma variable self.fichier1 ?

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    Je pense que la solution serait de créer une fonction qui prend en paramètre 2 fichiers, dont vous feriez la comparaison ligne par ligne

    Si une ligne du fichier n'est pas dans les lignes de l'autre fichier, le fichier est différent, d'où une fonction isdifferent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def isdifferent(file1, file2):
        with open(file1, 'r') as f1, open(file2, 'r') as f2:
            lines_f1 = [line.strip() for line in f1.readlines()]
            lines_f2 = [line.strip() for line in f2.readlines()]
            if len(lines_f1) != len(lines_f2):
                return True # fichiers différents
            else:
                for line in lines_f1:
                    if line not in lines_f2:
                        return True # fichiers différents
            return False # fichiers identiques

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Salut,

    Pour savoir si deux fichiers sont différents la méthode de fred1599 me va bien.

    Un point d'attention quand même.
    Un .CSV peut être aussi un ensemble d'enregistrements { a, b, c, d } (le dump d'une table de SGDB) différents un à un mais pas nécessairement placés au même endroit. Dans ce cas les .CSV { d, b, c, a } et { a, b, c, d } pourraient être égaux alors que les fichiers sont différents.

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

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    @Wiztricks

    Je pense que tu veux parler de cette partie de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    else:
        for line in lines_f1:
            if line not in lines_f2:
                return True
    En effet j'avais remarqué, mais aussi j'ai fais la constatation qu'un fichier ayant des lignes identiques placées différemment revenait à 2 fichiers identiques.

    Sinon on peut travailler par index

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    else:
        for ind, line in enumerate(lines_f1):
            if line != lines_f2[ind]:
                return True

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Salut,
    @fred1599
    Mon propos était de dire "attention, au delà de la comparaison du contenu des fichiers telle que proposée par filecmp, çà ne donnera pas nécessairement le résultat attendu".
    Je n'avais pas lu les détails du code et comme il fait "plus que" filecmp, il me plaît "moyen".

    Mon exemple sur l'inversion de deux lignes est weak pour illustrer la chose...
    Est-ce que parler d'inversion de colonnes parle plus?
    On pourrait avoir un .CSV construit avec "nom, prénom, age" l'autre avec "age, prénom, nom" qui pourraient être "égaux" sans pour autant être identiques.
    Ceci dit, cela dépasse sans doute largement les pré-occupations de l'auteur.

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

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    Mon propos était de dire "attention, au delà de la comparaison du contenu des fichiers telle que proposée par filecmp, çà ne donnera pas nécessairement le résultat attendu".
    Ha! Je l'avais oublié celui-là, bien joué

    Ceci dit, cela dépasse sans doute largement les pré-occupations de l'auteur.
    Je pense que oui, mais j'ai bien compris où tu voulais en venir.

    Je parlais de lignes identiques, mais placées différemment dans un fichier comparé à un autre.

    Bref, on va chercher loin, i think

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Par défaut
    sous linux, avant de faire ta comparaison, tu peux ordonner les 2 documents (en supprimant l'entête CSV des 2 fichiers avec la commande sort. du coup ça simplifie la comparaison

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 27
    Par défaut
    salut,

    merci pour tous ces éclaircissement qui vont bien m'aider .

    Très sympa ta fonction isdifferent fred1599 !

    Juste un dernier point à éclaircir pour ma culture perso.
    C'est pas possible de revenir au debut d'un csv.reader ?

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Salut,
    Citation Envoyé par Frank_Rook Voir le message
    Juste un dernier point à éclaircir pour ma culture perso. C'est pas possible de revenir au debut d'un csv.reader ?
    L'interface qui crée le csv.reader est de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f = open(filename, 'rb')
    csv.reader(f, delimiter=' ', quotechar='|')
    Si vous voulez positionner le fichier 'au début', il "suffit" de faire f.seek(0).
    En fait, le "reader" reçoit un iterable et fait .next dessus. Logiquement, cela devrait fonctionner et les quelques tests que j'ai fait sur un coin de table montrent que çà fonctionne.
    *MAIS* fonctionner sur un coin de table et supposer que le reader a été construit pour "supporter" ce cas d'utilisation sont deux choses différentes.

    Ensuite, il faut se poser la question de l'intérêt du cas d'utilisation i.e. pourquoi lire et jeter ce qu'on a lu? Si on doit relire "ensuite" pourquoi ne pas garder les informations en mémoire?

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

Discussions similaires

  1. Ajout d'une ligne en début de fichier CSV
    Par dbtn89 dans le forum Langage
    Réponses: 13
    Dernier message: 12/05/2015, 19h52
  2. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  3. Sortir un fichier csv sur base d une requete
    Par Freeman_80 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 12/01/2005, 11h21
  4. [String] Caractère en trop au début d'un fichier
    Par Seiya dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 12/07/2004, 14h00
  5. Réponses: 2
    Dernier message: 14/05/2004, 12h55

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