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 :

[classtype : dict] Blocage sur import d'un dictionnaire depuis un fichier texte


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Associatif
    Inscrit en
    Mai 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Associatif

    Informations forums :
    Inscription : Mai 2020
    Messages : 2
    Par défaut [classtype : dict] Blocage sur import d'un dictionnaire depuis un fichier texte
    Bonjour à toutes et à tous*!

    J’utilise un linux basé sur debian avec python3

    Je cherche à recharger un dictionnaire à partir d’un fichier texte (.txt) qui est créé par le programme. C’est en cas de coupure du programme, pour pouvoir reprendre sans perdre trop de données...

    Donc en premier lieu
    J’écris le contenu de mon dictionnaire «*ventes*» comme ceci*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	nomfichierlog = "log" + date + ".txt"
    	fichierlog = open(nomfichierlog, 'w')
    	print(ventes, file = fichierlog)
    	fichierlog.close()
    Cela me donne un fichier «*log2020-05-04.txt*» avec dedans ces infos par exemple*:
    {('TOTAL', 1): '6.00', ('Fer et métaux', 1): 1.0, ('Bricolage', 1): 2.0, ('Meubles', 1): 3.0, ('Bibelots et vaisselle', 1): 0, ('Textile, Fripes', 1): 0, ('Bibliothèque', 1): 0, ('Jeux et Sport', 1): 0, ('Petit et gros électro', 1): 0, ('Vélo et pièces détachées', 1): 0, ('Adhésions C2C', 1): 0, ('Dons C2C', 1): 0, ('Jardin', 1): 0, ('Matériel été', 1): 0}

    Ensuite pour recharger les infos je tente de faire simplement ceci*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	nomfichierlog = "log" + date + ".txt"
    	with open(nomfichierlog, 'r') as donnees :
    		ventes = donnees.readline()
    		ventes = dict(ventes)
    Le programme lit correctement les infos mais il considère que «*ventes*» est une string et cela me pose problème plus loin, d’où la ligne du dessous ou je stipule que «*ventes*» est bien un dictionnaire, mais a l’exécution j’ai l’erreur suivante*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	Traceback (most recent call last):
      File "UNIX-C2Caisse-0.10.py", line 461, in <module>
        ventes = dict(ventes) 
    ValueError: dictionary update sequence element #0 has length 1; 2 is required
    J’ai fait des tests de mise en forme des données (avec ""; sans {}, espace, ...) mais cela ne fonctionne pas.
    Les recherches sur l'erreur ne m'ont pas non plus aidée. J'ai essayé avec la fonction input de dict mais j'arrive au même résultat... Bref je sèche...

    Dernière info qui me chiffonne, si je réalise la manip en console python cela fonctionne*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> ventes = {}
    >>> ventes = {('TOTAL', 1): '2.00', ('Fer et métaux', 1): 2.0, ('Bricolage', 1): 0, ('Meubles', 1): 0, ('Bibelots et vaisselle', 1): 0, ('Textile, Fripes', 1): 0, ('Bibliothèque', 1): 0, ('Jeux et Sport', 1): 0, ('Petit et gros électro', 1): 0, ('Vélo et pièces détachées', 1): 0, ('Adhésions C2C', 1): 0, ('Dons C2C', 1): 0, ('Jardin', 1): 0, ('Matériel été', 1): 0}
    >>> type(ventes)
    <class 'dict'>
    >>> print(ventes['TOTAL',1])
    2.00
    Merci du coup de neurones*!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Si votre fichier contient la chaine de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {('TOTAL', 1): '6.00', ('Fer et métaux', 1): 1.0, ('Bricolage', 1): 2.0, }
    Ce n'est pas un dictionnaire mais une chaine de caractères.
    Par contre écrite dans un script python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d = {('TOTAL', 1): '6.00', ('Fer et métaux', 1): 1.0, ('Bricolage', 1): 2.0, }
    Ce n'est plus une chaine de caractères mais un dictionnaire sous forme littérale contenant... et pour passer de la chaine de caractères au dictionnaire, il y a tout le boulot de l'interpréteur d'évaluation du contenu du script. et éventuellement à mimer via eval:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d = eval("{('TOTAL', 1): '6.00', ('Fer et métaux', 1): 1.0, ('Bricolage', 1): 2.0, }")
    à utiliser avec prudence.

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

  3. #3
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    le module JSON sait faire ça très bien
    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
     
    >>> import json
     
    >>> d = {i: i for i in range(5)}
     
    >>> d
    {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
     
    >>> s = json.dumps(d)
     
    >>> s
    '{"0": 0, "1": 1, "2": 2, "3": 3, "4": 4}'
     
    >>> json.loads(s)
    {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}
     
    >>> with open("f.txt", "w", encoding="utf8") as f:
    	json.dump(d, f)
     
     
    >>> with open("f.txt") as f:
    	f.read()
    '{"0": 0, "1": 1, "2": 2, "3": 3, "4": 4}'
     
     
    >>> with open("f.txt") as f:
    	d = json.load(f)
     
    >>> d
    {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}
     
    >>> import os
    >>> os.remove("f.txt")
    Cependant comme vous pouvez le voir les clefs deviennent des chaines de caractère car dans le format JSON les clefs doivent être des chaines.
    Vous avez également plein d'autres méthodes, que se soit en utilisant d'autre formats (XML par exemple) ou en utilisant d'autre outils, pickles par exemple.

    Par contre la solution avec eval troll mode on : on se croirait en JS

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par flapili Voir le message
    le module JSON sait faire ça très bien
    JSON sait lire du JSON et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {('TOTAL', 1): '6.00', ('Fer et métaux', 1): 1.0, ('Bricolage', 1): 2.0, }
    n'est pas "json" et on ne sait pas sérialiser ce type de dictionnaire Python avec json. On pourrait juste le "pickler".

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

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Certes, mais on pourrait transformer un peu les données pour tirer avantageusement parti du module json.

    Par exemple transformer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {('TOTAL', 1): '6.00', ('Fer et métaux', 1): 1.0, ('Bricolage', 1): 2.0, }
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [('TOTAL', 1,'6.00'), ('Fer et métaux', 1, 1.0), ('Bricolage', 1, 2.0)]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par lg_53 Voir le message
    Certes, mais on pourrait transformer un peu les données pour tirer avantageusement parti du module json.
    Le PO dit:
    Je cherche à recharger un dictionnaire à partir d’un fichier texte (.txt) qui est créé par le programme. C’est en cas de coupure du programme, pour pouvoir reprendre sans perdre trop de données...
    Donc à priori, s'il faut revoir la méthode de sauvegarde, pickle est le bon outil pour sauvegarder un objet Python.

    JSON pourrait être "adapté" si le fichier doit pouvoir être modifié par l'utilisateur (dans ce cas, il pourrait le faire à coup d'éditeur).

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

Discussions similaires

  1. Importer des données depuis un fichier texte
    Par Tofalu dans le forum Contribuez
    Réponses: 1
    Dernier message: 28/07/2013, 11h55
  2. Importer depuis un fichier texte
    Par kis93 dans le forum MATLAB
    Réponses: 6
    Dernier message: 02/10/2008, 19h09
  3. Import de données provenant d'un fichier texte
    Par DanaX dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 19/09/2008, 12h25
  4. Importer directement des instructions MySQL en fichier texte dans MySQL
    Par lightstring4 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 09/05/2007, 17h39
  5. Blocage sur import de fichier CSV
    Par Pokerstar dans le forum Outils
    Réponses: 2
    Dernier message: 29/03/2007, 18h15

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