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 :

Zipfile : lecture ok, écriture plantée


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Paysan
    Inscrit en
    Juin 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2015
    Messages : 45
    Points : 39
    Points
    39
    Par défaut Zipfile : lecture ok, écriture plantée
    Bonjour,
    J'ai déconnecté du forum pendant quelques temps, désolé si je poste un doublon malgré mes recherches (de plus Python est nouveau pour moi ...
    Je voudrais constituer à partir de mes données un fichier archive contenant plusieurs fichiers json.
    La primitive ArchiveDonnees1 fonctionne très bien, et j'obtiens un fichier pack.aptbase correct.
    Mais j'ai écrit les deux json sur le disque! (c'est ce que je cherche à éviter)
    Je vérifie que le fichier pack.aptbase (archive) est directement et correctement lu par ChargeDonnees.

    Mais si je veux écrire directement pack.aptbase avec ArchiveDonnees2 (de structure analogue à la lecture directe), j'obtiens l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cs@cs-Vaio:~/Documents/Ateliers/Atl-Log/AptBureau$ python AptBureau.py
    Traceback (most recent call last):
      File "/home/cs/Documents/Ateliers/Atl-Log/AptBureau/Archive.py", line 45, in ArchiveDonnees
        with pack.open('Bandes.json','w') as f : json.dump(Bandes,f, indent=4)
      File "/usr/lib/python3.6/json/__init__.py", line 180, in dump
        fp.write(chunk)
      File "/usr/lib/python3.6/zipfile.py", line 1011, in write
        self._crc = crc32(data, self._crc)
    TypeError: a bytes-like object is required, not 'str'
    cs@cs-Vaio:~/Documents/Ateliers/Atl-Log/AptBureau$
    Mon contexte : Ubuntu 18.04 LTS, Pyside2, Qt5, Python 3.6.8

    Le 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    # Primitives de l'archivage des données d'application
    #
    # Chargement des données : ChargeDonnees()
    # Archivage des données : ArchiveDonnees()
    #
    # Début : 24 nov 2019
    #
     
    import json
    import zipfile
     
    import Alertes
     
    Bandes = {
            "BP1":{"latitude": 42, "longitude":2, "longueur":100, "largeur":5},
            "BP2":{"latitude": 42.5, "longitude":2, "longueur":80, "largeur":2.5},
            "HF1":{"latitude": 42, "longitude":1.9, "longueur":100, "largeur":1.5},
            "HF2":{"latitude": 42, "longitude": 2.1, "longueur":100, "largeur":1.5}
            }
     
    Cultures = {
            "BP1-0-190324":{"bande":"BP1", "position": 0, "nature":"Consoude", "nbUK":2},
            "BP1-0.5-190324":{"bande":"BP1", "position": 0.5, "nature":"Fraise", "nbUK":4},
            "BP1-4.5-190324":{"bande":"BP1", "position": 4.5, "nature":"Topinambour", "nbUK":2}
            }
     
    Actions = {
            "PrepBin":{"Lib":"Binage de préparation", "outil":{"griffe"},"spécs":""}
            }
     
    Actes = {
            "CodeDateUnique":{"culture":"BP1-0.5-190324", "Action":"PrepBin", "Comment":""},
            "CodeDateUnique":{"culture":"", "Action":{"Pluie":"", "hauteur":20}, "Comment":""}
            }
     
    def ArchiveDonnees1():
        with open('Bandes.json','w') as f : json.dump(Bandes,f, indent=4)
        with open('Cultures.json','w') as f: json.dump(Cultures,f, indent=4)
        Alertes.AlerteStatusBar('Données archivées',10000)
     
        # constitution du fichier global regroupant tous les json dans un fichier archive
        # technologie à maîtriser qui donne un fichier analogue à .odt (ou d'autres!)
        with zipfile.ZipFile('pack.aptbase', 'w') as pack:
            pack.write('Bandes.json')
            pack.write('Cultures.json')
            pack.close()
        Alertes.AlerteStatusBar('Pack de données archivé',10000)
     
    def ArchiveDonnees2():
        # constitution du fichier global regroupant tous les json dans un fichier archive
        # technologie à maîtriser qui donne un fichier analogue à .odt (ou d'autres!)
        with zipfile.ZipFile('pack.aptbase', 'w') as pack:
            with pack.open('Bandes.json','w') as f : json.dump(Bandes,f, indent=4)
            with pack.open('Cultures.json','w') as f: json.dump(Cultures,f, indent=4)
            pack.close()
        Alertes.AlerteStatusBar('Pack de données archivé',10000)
     
    def ChargeDonnees():
        #with open('Bandes.json','r') as f : Bandes=json.load(f)
        #with open('Cultures.json','r') as f : Cultures=json.load(f)
        with zipfile.ZipFile('pack.aptbase', 'r') as pack:
            with pack.open('Bandes.json','r') as f :
                Bandes=json.load(f)
                print(Bandes)
     
            with pack.open('Cultures.json','r') as f :
                Cultures=json.load(f)
                print(Cultures)
            pack.close()

  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,

    Je n'utilise pas json, mais il est bien marqué dans la doc que le module json ne produit que des str:

    The json module always produces str objects, not bytes objects
    Et l'erreur obtenue est assez claire: json donne des str et zipfile a besoin de bytes. Alors, peut-être faudrait-il regarder du côté de write ou writestr pour zipfile, au lieu de open?
    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
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    C'est peut-être particulier a zipfile.

    Essaye comme ceci pour voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        with zipfile.ZipFile('pack.aptbase', 'w') as pack:
            jsn = json.dumps(Bandes, indent=4)
            with pack.open('Bandes.json', 'wb') as f :
                f.write(jsn.encode('utf-8', 'replace'))
            jsn = json.dumps(Cultures, indent=4)
            with pack.open('Cultures.json', 'w'b) as f:
                f.write(jsn.encode('utf-8', 'replace'))
        Alertes.AlerteStatusBar('Pack de données archivé', 10000)

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Paysan
    Inscrit en
    Juin 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2015
    Messages : 45
    Points : 39
    Points
    39
    Par défaut
    Oui; j'ai déjà essayé en changeant json.dump(Bandes,f, indent=4) en f.write(json.dumps(Bandes, indent=4)), j'obtiens la même erreur.
    Par contre, je ne connaissais pas writestr:
    avec pack.writestr('Bandes.json',json.dumps(Bandes, indent=4)) ... ça fonctionne!!
    Le génie, c'est quand on est plusieurs (surtout si il y a un expert dans le groupe ... ;-) )
    Je coche résolu.

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

Discussions similaires

  1. Lecture et écriture de blocs
    Par incognito86 dans le forum C
    Réponses: 10
    Dernier message: 18/02/2007, 16h35
  2. [Applet] Sécurité lecture et écriture
    Par ZeKiD dans le forum Applets
    Réponses: 1
    Dernier message: 18/08/2006, 11h17
  3. [VB6] lecture et écriture de fichier
    Par robert_trudel dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 12/06/2006, 14h06
  4. [VB.NET]Problème de lecture et écriture sur fichier texte
    Par zouhib dans le forum Windows Forms
    Réponses: 25
    Dernier message: 23/05/2006, 15h30
  5. Ouvrir un fichier texte en lecture ET écriture
    Par Steph12 dans le forum C++
    Réponses: 12
    Dernier message: 17/06/2005, 08h08

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