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 :

copy.deepcopy(csv.DictReader): TypeError: can't pickle _csv.reader objects


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur généraliste en invalidité, beaucoup d'informatique
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur généraliste en invalidité, beaucoup d'informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut copy.deepcopy(csv.DictReader): TypeError: can't pickle _csv.reader objects
    Bonjour,
    Je cherche à dupliquer un objet csv.reader retourné par csv.DictReader(), en utilisant copy.deepcopy() sans succès.
    Impossible de trouver une piste
    D'avance merci de votre aide

    20190722-ChargeCsvDeepCopy.py :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Python 3.7.4
    import csv, copy
     
    chemFic = 'CAC_2019-06-28_ALL_MIN-0005 - Partiel.csv'
    with open(chemFic, newline='') as csvfile:
        dr = csv.DictReader(csvfile, delimiter=';')
        for row in dr:
            print(row)
            break
        reader = copy.deepcopy(dr)
    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
    >py 20190722-ChargeCsvDeepCopy.py
     
    OrderedDict([('DATE', '2019-06-28'), ('TIME', '00:00'), ('OPEN', '5501.9'), ('HIGH', '5507.4'), ('LOW', '5501.9'), ('CLOSE', '5504.5')])
     
    Traceback (most recent call last):
      File "20190722-ChargeCsvDeepCopy.py", line 10, in <module>
        reader = copy.deepcopy(dr)
      File "C:\Users\ericg\AppData\Local\Programs\Python\Python37\lib\copy.py", line 180, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "C:\Users\ericg\AppData\Local\Programs\Python\Python37\lib\copy.py", line 280, in _reconstruct
        state = deepcopy(state, memo)
      File "C:\Users\ericg\AppData\Local\Programs\Python\Python37\lib\copy.py", line 150, in deepcopy
        y = copier(x, memo)
      File "C:\Users\ericg\AppData\Local\Programs\Python\Python37\lib\copy.py", line 240, in _deepcopy_dict
        y[deepcopy(key, memo)] = deepcopy(value, memo)
      File "C:\Users\ericg\AppData\Local\Programs\Python\Python37\lib\copy.py", line 169, in deepcopy
        rv = reductor(4)
    TypeError: can't pickle _csv.reader objects

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    Citation Envoyé par ego37 Voir le message
    Je cherche à dupliquer un objet csv.reader retourné par csv.DictReader(), en utilisant copy.deepcopy() sans succès.
    Si çà ne fonctionne pas simplement, la question à vous poser (et ce que vous devriez expliquer) est pourquoi cherchez à faire çà: il y a certainement plus simple pour le réaliser.

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

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur généraliste en invalidité, beaucoup d'informatique
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur généraliste en invalidité, beaucoup d'informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Zalut wiztricks,

    Désolé, Je suis débutant.

    Tant que je suis dans le contexte de "with open(chemFic, newline='') as csvfile:", l'objet csv.DictReader est utilisable.
    Mon objectif est de l'instancier dans une méthode puis le conserver dans l'attribut d'un objet.
    Peut-être y-a-t'il d'autres moyens ?

    Merci d'avance

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    Citation Envoyé par ego37 Voir le message
    Tant que je suis dans le contexte de "with open(chemFic, newline='') as csvfile:", l'objet csv.DictReader est utilisable.
    Les variables définies dans le corps du bloc with.... : restent définies à sa sortie (si on y entre).
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> with open('toto.dat') as z:
    ...      bbb = 1
    ...
    >>> bbb
    1
    Par contre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> del bbb
    >>> with open('totozzzz.dat') as z:
    ...      bbb = 1
    ...
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    FileNotFoundError: [Errno 2] No such file or directory: 'totozzzz.dat'
    >>> bbb
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'bbb' is not defined
    >>>
    Ceci dit, sorti du block, si vous avez lu les données du fichier, le csv.DictReader ne sert plus à rien.

    Citation Envoyé par ego37 Voir le message
    Mon objectif est de l'instancier dans une méthode puis le conserver dans l'attribut d'un objet.
    Pourquoi faire un copy.deepcopy plutôt que l'assigner à un attribut/variable?

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

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur généraliste en invalidité, beaucoup d'informatique
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur généraliste en invalidité, beaucoup d'informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci wiztricks,
    Pourtant, avec 20190722-ChargeCsv-DataInAttrib.py :
    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
    # Python 3.7.4
    import csv, copy
     
    class maClasse:
        def chargeCSV(self, chemFic):
            with open(chemFic, newline='') as csvfile:
                self.data = csv.DictReader(csvfile, delimiter=';')
                print('== self.data :')
                for row in self.data:
                    print(row)
                    break
     
    monObjet = maClasse()
    monObjet.chargeCSV('CAC_2019-06-28_ALL_MIN-0005 - Partiel.csv')
    print('== monObjet.data :')
    for row in monObjet.data:
        print(row)
        break
    J'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    > py 20190722-ChargeCsv-DataInAttrib.py
    == self.data :
    OrderedDict([('DATE', '2019-06-28'), ('TIME', '00:00'), ('OPEN', '5501.9'), ('HIGH', '5507.4'), ('LOW', '5501.9'), ('CLOSE', '5504.5')])
    == monObjet.data :
    Traceback (most recent call last):
      File "20190722-ChargeCsv-DataInAttrib.py", line 16, in <module>
        for row in monObjet.data:
      File "C:\Users\ericg\AppData\Local\Programs\Python\Python37\lib\csv.py", line 112, in __next__
        row = next(self.reader)
    ValueError: I/O operation on closed file.
    Où ai-je fait fausse route ?
    Merci d'avance

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    Citation Envoyé par ego37 Voir le message
    Où ai-je fait fausse route ?
    Une fois sorti du bloc with..., le fichier est fermé...
    Et c'est pour çà qu'on utilise le "with".

    Donc vous ne pouvez pas d'un côté utiliser "with" et en attendre quelque chose pour lequel il n'a pas été construit... sans que je me pose de questions sur "est-ce que vous comprenez un peu les lignes de code que vous avez écrit?" et vous suggérer d'ouvrir un tuto. pour apprendre les bases de la programmation, revoir ce que sont les fichiers, ....

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

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur généraliste en invalidité, beaucoup d'informatique
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur généraliste en invalidité, beaucoup d'informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Re-bonjour,
    Trop aimable pour votre remarque acerbe :
    sans que je me pose de questions sur "est-ce que vous comprenez un peu les lignes de code que vous avez écrit?" et vous suggérer d'ouvrir un tuto. pour apprendre les bases de la programmation, revoir ce que sont les fichiers, ....
    Je vous prierai à l'avenir de réfléchir à deux fois avant de proférer vos sarcasmes. Un forum est un lieu d'entraide et de convivialité d'après la charte du votre également d'ailleurs.
    Il ne me semble pourtant pas que le sujet n'est pas du niveau débutant-débutant, qu'il ne concerne les bases de la programmation ni de savoir ce que sont les fichiers.
    Si simple que votre démonstration :
    Les variables définies dans le corps du bloc with.... : restent définies à sa sortie (si on y entre).
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> with open('toto.dat') as z:
    ...      bbb = 1
    >>> bbb
    1
    qui fonctionne avec un type de base ne fonctionne plus avec un objet dont on ne détient qu'une référence.
    Ce sujet concerne la problématique classique en programmation objet de conserver le contenu d'un objet dont on détient une référence, avant qu'il ne disparaisse, et pour cela il faut bien le dupliquer.

    Aussi je réitère ma question, y-a-t'il moyen de dupliquer un objet csv.DistReader, sans le faire "à la main" avec des boucles ?
    ego37

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Citation Envoyé par ego37 Voir le message
    Je vous prierai à l'avenir de réfléchir à deux fois avant de proférer vos sarcasmes. Un forum est un lieu d'entraide et de convivialité d'après la charte du votre également d'ailleurs.
    Il ne me semble pourtant pas que le sujet n'est pas du niveau débutant-débutant, qu'il ne concerne les bases de la programmation ni de savoir ce que sont les fichiers.
    Si vous écriviez:
    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
    import csv, copy
     
    class maClasse:
        def chargeCSV(self, chemFic):
                csvfile = open(chemFic, newline='')
                self.data = csv.DictReader(csvfile, delimiter=';')
                print('== self.data :')
                for row in self.data:
                    print(row)
                    break
     
    monObjet = maClasse()
    monObjet.chargeCSV('CAC_2019-06-28_ALL_MIN-0005 - Partiel.csv')
    print('== monObjet.data :')
    for row in monObjet.data:
        print(row)
        break
    votre code devrait fonctionner sans problème.

    Si vous n'arrivez pas à distinguer ces petits détails dans le code que vous écrivez, c'est que sans maîtrisez les bases inutile de vous lancer dans des choses compliquées.

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

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur généraliste en invalidité, beaucoup d'informatique
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur généraliste en invalidité, beaucoup d'informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Re-bonjour,
    Vous ne m'apprenez rien avec mon bout de code modifié et laissez dans ce cas le fichier ouvert, ce qui n'est pas propre du tout et ne répond pas au problème posé.
    Je ne comprends toujours pas votre agressivité dès le début.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Citation Envoyé par ego37 Voir le message
    Vous ne m'apprenez rien avec mon bout de code modifié et laissez dans ce cas le fichier ouvert, ce qui n'est pas propre du tout
    Tout à fait.... mais le code fonctionne et çà montre que le soucis est dans le "with".

    Citation Envoyé par ego37 Voir le message
    Je ne comprends toujours pas votre agressivité dès le début.
    Je ne suis pas agressif, je vous demande juste d'être cohérent entre les fonctionnalités que vous utilisez et les attentes que vous en avez. Et si vous voulez utilisez une structure telle que csv.DictReader associée à un fichier a l'extérieur d'un block "with"... c'est même pas la peine d'y penser.

    Une bonne pratique (celle qu'on apprend dans les tutos) est d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import csv
     
    class maClasse:
        def chargeCSV(self, chemFic):
            with open(chemFic, newline='') as csvfile:
                self.data = list(csv.DictReader(csvfile, delimiter=';'))
     
     
    monObjet = maClasse()
    monObjet.chargeCSV('CAC_2019-06-28_ALL_MIN-0005 - Partiel.csv')
    print('== monObjet.data :')
    for row in monObjet.data:
        print(row)
    i.e. on lit tout le fichier dans le block "with" et on stocke son contenu dans une structure de données cohérente avec les traitements qu'on fera par la suite.

    Et s'il faut lire le fichier petit bout par petit bout depuis différents endroits du programme, on évite d’utiliser "with" et on gère les exceptions pour que ce soit "propre".

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

Discussions similaires

  1. Librairy csv.DictReader - Mise en forme
    Par bm dans le forum Général Python
    Réponses: 3
    Dernier message: 16/11/2016, 19h18
  2. [Python 3.X] TypeError: can't multiply sequence by non-int of type 'function'
    Par segolsed dans le forum Général Python
    Réponses: 11
    Dernier message: 12/06/2016, 11h24
  3. COPY FROM + CSV + les titres des colonnes ?
    Par logiclogic dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 22/01/2013, 13h35
  4. [XL-2010] Copie fichier csv dans feuilles xlsm
    Par pdufranc dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/10/2012, 11h33
  5. copy.deepcopy et AttributeError
    Par quiscoul dans le forum Général Python
    Réponses: 2
    Dernier message: 06/11/2008, 08h03

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