[Python] Importation de données
Posté le 01/09/2019 14:25
Bonjour, nouveau projet à l'utilité douteuse, créer un système d'importation de données propre pour le Micro Python de la 90+e.
L'idée et connaissances nécessaires :
Les deux commandes nécessaires à connaitre sont
ord() (transforme un caractère en un entier) et
chr() (l'inverse).
Ces deux commandes ne fonctionnent qu'avec des valeurs comprises (en considérant qu'elles sont entières) de 0 à 255.
De ces 256 caractères, 128 sont inutilisés.
Les 128 premiers (de l'indice 0 à 127) semblent correspondre à la norme ascii.
Code de test
Code de test
for i in range(128): #vous pouvez remplacer 128 par 256, mais les résultats ne seront pas tous affichés et les 128 derniers sont non visibles.
print(chr(i))
Les contraintes :
La commande
open() est inutilisable (présumée bridée par Casio).
La seule façon d'importer des données est d'importer un autre fichier
.py respectant la norme.
La mémoire de la calculatrice est limitée.
Certains caractères ne peuvent pas être utilisés dans une chaîne sans perdre de l'espace (exemple :
",
\ et les retours à la ligne nécessiteraient un échappement (
\) ce qui serait contreproductif (deux octets en mémoire pour un octet lu).
Plan de projet :
Créer deux programmes, tous deux en Python, un pour ordinateur ("encodage" des données) et un pour la calculatrice, pouvant "décoder" ces données en renvoyer des nombres entiers par itération.
Le faire avec le moins de perte d'espace possible en utiliser la fonction
import.
Je poste le plan avant de commencer le code pour vérifier que je n'ai rien manqué d'important
(et que tout est bien clair)
Merci d'avance.
Plus d'information sur l'ASCII.
https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
Citer : Posté le 01/09/2019 14:45 | #
Intéressant. Quel format de données récupérerait-on en sortie du décodeur ? Une liste d'entiers, uniquement ?
Citer : Posté le 01/09/2019 14:53 | #
Cela dépendra en réalité, j'aimerais que le résultat final soit relativement simple d'utilisation.
La liste d'entier sera une première étape, j'aimerais à long terme parvenir à stocker des informations plus concrètes (variables, listes, voir même chaînes et écrans).
Ajouté le 02/09/2019 à 15:03 :
J'ai un peu travaillé dessus aujourd'hui, voici ce que j'en ai tiré :
1. L'idée est bonne (c'est déjà ça )
2. 94 caractères différents peuvent être utilisés (
!
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
(guillemet inversé)
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
3. La lecture de données avance bien sur la calculatrice, le programme demandera le nombre de sorties différentes (par exemple pour une salle avec des murs ou rien, cela fait 2 possibilités) et retournera une liste d'entiers (pour le moment).
Citer : Posté le 02/09/2019 16:10 | #
Question de principe pour aider à améliorer ton post principal.
Pourquoi tu ne fais pas juste un fichier avec des variables contenant ce que tu veux ?
Citer : Posté le 02/09/2019 16:45 | #
Question de principe pour aider à améliorer ton post principal.
Pourquoi tu ne fais pas juste un fichier avec des variables contenant ce que tu veux ?
Merci
Je vais devoir réfléchir un peu car je me rend compte que je ne sais pas l'expliquer clairement
Mais voici un exemple pour éclairer temporairement son utilité :
x = 5
y = 6
difficulty = 20
level_id = 0
level = "xx x xxx x xxx xxx x xx x xxx x xxx xxx x xx x xxx x xxx xxx x xx x xxx x xxx xxx x xx x xxx x xxx xxx x xx x xxx x xxx xxx x "
// level.py, un bon nombre de variables stockées avec ce projet (les caractères sont ici choisis au hasard, le programme étant en développement)
infos = "sjqk"
level = "qisdjkqmolshdjkqisdjtuis"
Le gain d'espace est énorme !
A noter que dans mon exemple, j'ai volontairement choisi d'utiliser plus de caractères que nécessaire pour le stockage du niveau
(La version finale devrait pouvoir stocker plus de données binaires en 21 caractères)
Citer : Posté le 02/09/2019 16:48 | #
Voilà, le gain est vachement cool. En contrepartie, tu perds le typage.
Peut-être au fond que ce que tu as là c'est un système de compression pour certains types de données (des listes d'entiers, pour l'instant), pour gagner de la place sur le stockage. Et là ça marche indépendamment de si le code est dans un autre fichier que tu importes ou dans le même fichier
Citer : Posté le 02/09/2019 17:17 | #
Forcément ça marchera pour les graph 35 +E II , et pour le micropython de zezombie par le même coup ...
Intéressant ...
Passé ici il y a peu. ಥ‿ಥ
Jouez à Mario sans arrêt sur votre Casio !
City Heroes
Piano Casio
Micro GIMP
Citer : Posté le 12/09/2019 16:40 | #
Forcément ça marchera pour les graph 35 +E II , et pour le micropython de zezombie par le même coup ...
Intéressant ...
Pas sûr, il y a des différences entre l'interpréteur de ZZ et Casio, cela pourrait impacter la sortie. A suivre.
J'avance doucement dans l'ombre, la structure du programme de base est quasi-terminée, avec ma méthode actuelle (améliorable, mais bon...) une données peut faire un maximum théorique de 258 caractères (c'est déjà pas mal !).
Juste un petit post pour montrer que je continue
Citer : Posté le 12/09/2019 16:51 | #
Pour des caractères ascii, le ord() et chr() devraient retourner la même chose. (tu as essayé de voir si les caractères non-ascii marchaient ?)
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 12/09/2019 17:39 | #
Pour des caractères ascii, le ord() et chr() devraient retourner la même chose. (tu as essayé de voir si les caractères non-ascii marchaient ?)
ord() renvoie un nombre et chr() un caractère.
Je n'ai pas essayé avec les caractères non-ascii, je vais voir on ne sait jamais
Ajouté le 18/09/2019 à 08:58 :
[...] (tu as essayé de voir si les caractères non-ascii marchaient ?)
J'ai un gros temps de latence...
J'ai essayé, ça ne fonctionne pas, les caractères sont splités en plus petits caractères.
("€" donne trois espaces par exemple)
Citer : Posté le 18/09/2019 13:12 | #
Si je puis me permettre , j'ai une technique beaucoup plus simple , via un programme C'basic , ce programme rajoute simplement file=" et " , au fichier à ouvrir ( .csv , txt , etc ) et sauvegarde la string créé dans un fichier Python , il suffit alors de faire from X.py import file , et on a le même résultat qu'un vrai open , sans aucun logiciel d'utilisé sur le PC
Passé ici il y a peu. ಥ‿ಥ
Jouez à Mario sans arrêt sur votre Casio !
City Heroes
Piano Casio
Micro GIMP
Citer : Posté le 18/09/2019 13:15 | #
("€" donne trois espaces par exemple)
Parce que tu l'as sauvegardé en utf-8 sûrement, où € est encodé avec 3 octets, qui sont considérés comme 3 caractères séparés.
La question est : si tu fais ord() sur ces caractères, est ce que tu obtiens des bonnes valeurs ? Dans ce cas tu pourrais bien utiliser toutes les valeurs d'un octet (sans le \0, \n, " ou \ ce qui fait 252).
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 18/09/2019 16:34 | #
Si je puis me permettre , j'ai une technique beaucoup plus simple , via un programme C'basic , ce programme rajoute simplement file=" et " , au fichier à ouvrir ( .csv , txt , etc ) et sauvegarde la string créé dans un fichier Python , il suffit alors de faire from X.py import file , et on a le même résultat qu'un vrai open , sans aucun logiciel d'utilisé sur le PC
Oui bon t'as pas vraiment compris le principe de compression mais en gros c'est l'idée
Le but est d'optimiser les données importées de cette façon.
("€" donne trois espaces par exemple)
Parce que tu l'as sauvegardé en utf-8 sûrement, où € est encodé avec 3 octets, qui sont considérés comme 3 caractères séparés.
La question est : si tu fais ord() sur ces caractères, est ce que tu obtiens des bonnes valeurs ? Dans ce cas tu pourrais bien utiliser toutes les valeurs d'un octet (sans le \0, \n, " ou \ ce qui fait 252).
Non, j'avais essayé bien avant d'afficher tous les charactères de valeur 0 à 255, la moitié supérieure à 127 semble invalide (vide).
Ce ne sont pas des caractères pour l'interpréteur j'ai l'impression, je n'ai pas encore essayé d'éditer le fichier en hexa mais ce serait le dernier moyen. De plus, beaucoup de caractères sont utilisés côté système (c'est de l'ascii après tout).