Question de newbie : structures de données

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Question de newbie : structures de données

Message par vague nerd » lun. 16 mai 2016 18:23

Maintenant, je me bas avec json. J'ai essayé de mettre cette syntaxe directement dans un fichier json, mais impossible de le lire.
Pas grave, je n'ai qu'a enregistrer ma structure, j'aurai la bonne syntaxe. Ben non :

Code : Tout sélectionner

Traceback (most recent call last):
  File "readWithLight.py", line 43, in <module>
    read_uids()
  File "readWithLight.py", line 39, in read_uids
    json.dump(namedUids, outfile)
  File "/usr/lib/python2.7/json/__init__.py", line 181, in dump
    for chunk in iterable:
  File "/usr/lib/python2.7/json/encoder.py", line 427, in _iterencode
    for chunk in _iterencode_dict(o, _current_indent_level):
  File "/usr/lib/python2.7/json/encoder.py", line 375, in _iterencode_dict
    raise TypeError("key " + repr(key) + " is not a string")
TypeError: key (1,2,3,4,5) is not a string
D'où la mise en garde :
Manfraid a écrit :par contre pour le stockage en fichier c'est plus complexe il faut passez par le module pickle par contre pas d'édition possible par autre chose que python
Bon. stop là, je craque !

Edit : pickle permet d'enregistrer 'en clair' (ie en asci), ce qui pourrait me convenir. Cependant, tout n'y est pas très clair.
Du coup, pourquoi ne pas convertir les clés en quelque chose de gérable par la librairie json ? Par exemple une chaîne de caractère (encore une fois, pas besoin de grande perf à ce niveau)?
Cdt.
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Question de newbie : structures de données

Message par vague nerd » lun. 16 mai 2016 20:12

Je suis parti sur ma dernière idée.
Sauf que :

Code : Tout sélectionner

print namedUids[name]
affiche la valeur attendue,

Code : Tout sélectionner

print namedUids[name] + " qqucheose"
crash avec

Code : Tout sélectionner

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 8: ordinal not in range(128)
J'ai résolu ça en faisant un

Code : Tout sélectionner

print str(namedUids[name]) + " qqucheose"
C'est parce que namedUids[name] retourne des bytes et non une chaine ?

Cdt.
Cordialement,

Vague Nerd

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Question de newbie : structures de données

Message par Manfraid » mar. 17 mai 2016 08:24

Oui c'est bien ça, comme tu travaille avec python2 la gestion des chaines de caractère est assez tordu, je te conseille d’ailleurs de passer au python3 qui gère beaucoup mieux les chaines de caractère et de plus il est en UTF-8 en standard
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Question de newbie : structures de données

Message par vague nerd » mar. 17 mai 2016 10:07

Ok, merci.
Et concernant ce post ? En particulier :
Edit : pickle permet d'enregistrer 'en clair' (ie en asci), ce qui pourrait me convenir. Cependant, tout n'y est pas très clair.
Du coup, pourquoi ne pas convertir les clés en quelque chose de gérable par la librairie json ? Par exemple une chaîne de caractère (encore une fois, pas besoin de grande perf à ce niveau)?
C'est ce que j'ai fait et ça fonctionne bien. Y aurait-il un inconvénient qui m'aurait échappé ?
Cdt.
Cordialement,

Vague Nerd

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Question de newbie : structures de données

Message par Manfraid » mar. 17 mai 2016 10:38

oui je comprends donc n'utilise pas pickles car l'édition du fichier généré peu poser de gros soucis pour récupéré les valeurs.

Si tu veux rester en json, tu peu faire un tableau avec en clé le texte que tu veux et en valeur l'uid
fichier json :

Code : Tout sélectionner

{
 "uid1" : [1,2,3,4],
 "uid2" : [5,6,7,8]
}
et dans ton script

Code : Tout sélectionner

import json

uids = json.load(open('fichier.json'))
uid = [1,2,3,4] # uid de test
if uid in uids.values():
    for key,value in uids.items():
         if uid == value:
            print(key)

voila un début pour que tu puisse comprendre le principe

attention ce code n'est que pour python 3
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Question de newbie : structures de données

Message par vague nerd » mar. 17 mai 2016 12:34

Merci de ton aide.
oui je comprends donc n'utilise pas pickles car l'édition du fichier généré peu poser de gros soucis pour récupéré les valeurs.
Ben j'ai utiliser pickle (en mode ascii) pour enregistrer la structure, et voir à quoi ça ressemblait. Comme il y avait des choses en plus de mes données que je ne comprenais pas trop, j'en suis arrivé à la conclusion que tu donnes (si je l'édite, je vais galerer). Du coup, je suis reparti sur json, avec la clé en mode chaîne de caractère. Ca donne ça.

Lecture des fichiers (rien de particulier) :

Code : Tout sélectionner

uids = json.load(open('uids.json'))
namedUids = json.load(open('namedUids.json'))
Extraction du label :

Code : Tout sélectionner

try:
    name = str(namedUids[str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])+","+str(uid[4])])
except KeyError:
    name = 'Badge inconnu'
Les .json :

Code : Tout sélectionner

[
	[1,2,3,4,5],
	[6,7,8,9,10]
]

Code : Tout sélectionner

{
	"1,2,3,4,5": "Carte 2",
	"6,7,8,9,10": "Badge 1"
}
Pourquoi deux fichiers ? Ca me semble plus pratique de pouvoir retirer du premier fichier un tag rfid (pour l'invalider) et ne jamais modifier le second (qui donne un nom au tag).
Ainsi, je produis facilement, à la lecture, les chaines "Badge 1 autorisé", "Carte 2 rejeté", "Tag inconnu rejeté".
Mais bon, c'est pas très élégant. Un seul fichier avec une structure plus compliquée (id, label, validité) aurait été plus sexy.

De plus, je me rends compte en faisant les copier/coller que le premier fichier json utilise une liste de liste et non une liste de tuples. Si je me souviens bien de mes lectures de cette nuit, la recherche dans une liste de liste est plus lente que la recherche dans un tuple de tuple. C'est vrais ?

Au final, tu me conseille quoi ? J'imagine tout dans le même fichier, en tuple de tuple...Non, dsl, fatigué.
Cdt.
Cordialement,

Vague Nerd

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Question de newbie : structures de données

Message par Manfraid » mar. 17 mai 2016 12:58

oui c'est beaucoup plus rapide pour les tuples que les listes, par contre on ne peu pas sauvegarder de tuple en json il sont convertie en liste directement

par contre pour ton label je te conseille de faire ceci

Code : Tout sélectionner

try:
    name = str(namedUids['{},{},{},{}'.format(*uid)])
except KeyError:
    name = 'Badge inconnu'
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Question de newbie : structures de données

Message par vague nerd » mar. 17 mai 2016 13:06

oui c'est beaucoup plus rapide pour les tuples que les listes, par contre on ne peu pas sauvegarder de tuple en json il sont convertie en liste directement
Ok, j'en reste là. Et désolé de t'avoir fait répéter ! :mrgreen:
par contre pour ton label je te conseille de faire ceci
Waouuuu, bon ben google est mon ami !

Encore merci de ton aide.
Cdt.
Cordialement,

Vague Nerd

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Question de newbie : structures de données

Message par Manfraid » mar. 17 mai 2016 13:08

mais de rien ;)
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Répondre

Retourner vers « Python »