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 :

csv reader object


Sujet :

Python

  1. #1
    Membre du Club Avatar de chaying
    Inscrit en
    Mars 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 84
    Points : 57
    Points
    57
    Par défaut csv reader object
    J'ai ce code dont je ne comprends pourquoi il me renvoie la ValueError code. Si je comprends bien, c'est parce que le fichier est deja ferme. Mais puisque l'objet csv est dans une variable pourquoi devrait-il rester ouvert ?

    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
        #! /usr/bin/env python
        # -*- coding: UTF-8 -*-
     
        import csv
     
        class A:
     
            def __init__(self):
                self.PATH = '/path/to/file'
                self.READER = None
     
            def get_params(self):
                try:
                    File = open(self.PATH, 'rb')
                    self.READER = csv.DictReader(File)
                finally:
                    File.close()
     
                return self.READER
     
        inst = A()
        inst.READER = inst.get_params()
        for i in inst.READER:
            print i
    error code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Traceback (most recent call last):
          File "reader.py", line 23, in <module>
            for i in inst.READER:
          File "/usr/lib/python2.6/csv.py", line 103, in next
            self.fieldnames
          File "/usr/lib/python2.6/csv.py", line 90, in fieldnames
            self._fieldnames = self.reader.next()
        ValueError: I/O operation on closed file
    Quelqu'un a une idee ?

    Merci

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Cela veut dire que "self.READER = csv.DictReader(File)" ne fait pas une copie "autonome" du fichier dans une liste de dictionnaires, mais la prépare. Et la ligne "for i in inst.READER:" utilise encore l'objet csv et a donc besoin du fichier ouvert.

    A mon avis, il faut lire la liste de dictionnaires dans la méthode get_params, et la renommer autrement (par exemple get_csv). Voilà ce que ça pourrait donner:

    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
    import csv
     
    class A:
     
        def __init__(self):
            self.PATH = 'monfichier.csv'
            self.liste = None
     
        def get_csv(self):
            try:
                File = open(self.PATH, 'rb')
                self.liste = []
                for ligne in csv.DictReader(File, delimiter=';', quotechar='"'):
                    self.liste.append(ligne)
            finally:
                File.close()
     
            return self.liste
     
    inst = A()
    liste = inst.get_csv()
    for ligne in liste:
        print ligne
    Dans ce code, la liste est lue intégralement avant que le fichier csv ne soit fermé.

    Il faut, bien sûr, ajuster les données: monfichier.csv, delimiter et quotechar.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre du Club Avatar de chaying
    Inscrit en
    Mars 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 84
    Points : 57
    Points
    57
    Par défaut
    Salut tyrtamos

    Merci pour l'explication !

    Et le code ! C'est finalement pour cette solution que j'avais opte. Ca me paraissait bizarre de ne rien trouver de plus simple ou "elegant" que de sauvegarder le tout dans une liste mais si un expert me le confirme !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [1.x] Créer un fichier csv avec PHP-excel-reader
    Par blasil64 dans le forum Symfony
    Réponses: 2
    Dernier message: 21/05/2010, 09h46
  2. [DDL] "object <table> is in use"
    Par TMuet dans le forum SQL
    Réponses: 4
    Dernier message: 26/01/2004, 10h18
  3. Réponses: 8
    Dernier message: 21/11/2003, 18h38
  4. Comment inserer des donnee de type Large Object !!
    Par josoft dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2003, 11h21
  5. CSV et XMLRAD
    Par JCK dans le forum XMLRAD
    Réponses: 4
    Dernier message: 26/04/2003, 19h21

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