[Résolu] - Générer des variables

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Répondre
phdenaujan
Messages : 63
Enregistré le : lun. 5 janv. 2015 21:29

[Résolu] - Générer des variables

Message par phdenaujan » ven. 12 juin 2015 08:07

Bonjour,

Voilà le problème :

Je scanne un dossier et lis tous les fichiers contenus commençant par 'config' (config1.txt, config2.txt, ...)
Dès que lorsque le 1ere ligne du fichier contient le mot clef entré dans la condition, j’attribut à une liste l'ensemble des éléments contenus dans le fichiers.

Le problème : Je ne connais pas la nombre de fichiers dans le dossier (parce qu'il est variable). je souhaite donc créé des listes à la demande :

variable1 = fichier 1,
variable2 = fichier 2,
...

En PHP facile, en Python je coince.

Merci de votre aide,
Modifié en dernier par phdenaujan le dim. 14 juin 2015 14:26, modifié 1 fois.
Ph.

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

Re: Générer des variables

Message par Manfraid » ven. 12 juin 2015 08:16

Salut,

en python il me semble que l'on ne peu pas de créer de variable a la volée, par contre tu peu utiliser une liste en plus facile d'accès et facile a scruter
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.

phdenaujan
Messages : 63
Enregistré le : lun. 5 janv. 2015 21:29

Re: Générer des variables

Message par phdenaujan » ven. 12 juin 2015 13:39

Salut Manfraid,

C'est déjà le cas, une liste par fichier. Chaque ligne devient une valeur de la liste. Le problème réside dans le fait que j'ai parfois besoin d'ajouter une ligne à ce fichier. et comme j'aime bien hiérarchiser, je voudrais éviter une valeur[15] alors qu'elle devrait (d'un point de vu fonctionnement) être en valeur [9].

Je vais regarder du coté des dictionnaires (a savoir créer un dictionnaire dans un dictionnaire).
Ph.

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

Re: Générer des variables

Message par Manfraid » ven. 12 juin 2015 15:44

Désolé mais je ne comprends pas vraiment ce que tu veux faire, donc je n'ai pas trop de piste a te donnée

essaye d'expliquer toutes ta logique pour que je puisse mieux t'aiguillier
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.

phdenaujan
Messages : 63
Enregistré le : lun. 5 janv. 2015 21:29

Re: Générer des variables

Message par phdenaujan » ven. 12 juin 2015 20:48

J'ai un dossier contenant des fichiers de configuration : config1.txt, config2.txt, config3.txt, .... Ces fichiers sont générés par l'utilisateur via une page PHP.

Chacun de ces fichiers (que nous appellerons scénario) contient des données à traiter par un script python. Ces données sont du genre :

Eclairage # Type de gestion
08:00 # Heure d'allumage
Séjour # Localisation

Le script python exécute :
- 1 scan du dossier afin de déterminer combien de scénarios ont été saisis par l'utilisateur,
- Attribut l'ensemble des lignes à une liste soit : NomDeLaListe1 [Eclairage, 08:00, Séjour]
- Puis exécute les fonctions programmées en lisant NomDeLaListe1[0], NomDeLaListe1[1], NomDeLaListe1[2]

Aujourd'hui, mon sript fonctionne car programmé en appelant 0, 1, 2, ...

Si j'avais à modifier la composition du fichier de configuration par exemple en ajoutant une heure d'extinction je le ferais comme suivant

Eclairage # Type de gestion
08:00 # Heure d'allumage
22:00 # Heure d'extinction (c'est un peu c.. de l'avoir oublié !)
Séjour # Localisation

et donc comme tu l'auras compris, même sans lancer le script, BUG. Evidemment la solution de base serait de placer l''heure d'extinction après la localisation mais ça peut vite devenir compliqué à la relecture/réécriture.

Mon premier problème été donc de générer des variables automatiquement pour réceptionner l'ensemble de données des scripts (5 fichiers config donc 5 listes, 100 fichiers config donc 100 listes, 1000...) J'ai résolu temporairement le problème en créant un dictionnaire en suivant le schéma :

Code : Tout sélectionner

mesconfig {}
mesconfig ['config'+boucle] = ligne
"ligne" étant créée par un "ligne = fichier.readlines()".

Ça marche, je génère donc des listes par l’intermédiaire d'un dictionnaire. Oups's j'ai dis "liste", les valeurs sont donc appelées avec leur numéro. Quid de mon "22:00" qui doit être ajouté !

Comme tu me l'as confirmé, python ne sait pas générer des noms de variable automatiquement, je pense donc créé un dictionnaire dans un dictionnaire et modifier mes fichiers config sous cette forme :

fonction:Eclairage
heurematin:08-00
heuresoir:22-00
localisation:Séjour

Lire ces fichiers dans mon script, faire un split et utiliser le 1er terme comme clé et le second comme valeur. Je n'aurais donc plus de problème à l'ajout d'une valeur.

Pour compliquer un peu la sauce, mon script vérifie que les autres scénarios ne sont pas associer avec celle en cours (en utilisant localisation). Par exemple si jamais un des scénarios été :

fonction:TV
allumage:17-00
localisation:Séjour

Je pourrais éventuellement considérer que puisque ces 2 éléments sont localisés au même endroit, un action commune peut être intéressante dans le créneau commun (comme, par exemple, mettre de la bière au frais).

Toutes mes excuses, c'est un peu long. J’espère que c'est un peu clair !
Ph.

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

Re: Générer des variables

Message par Manfraid » sam. 13 juin 2015 08:41

OK très belle explication.

Donc je commence à comprendre. Pourquoi ne pas avoir sauvegarder au format JSON dans les fichier comme cela en lisant ave poython tu pourras tout récupérer en une fois dans un dictionnare. Et de plus l'avantage du dictionnaire et que tu peu essayer de récupérer une clé même si elle n'existe pas

Comme ceci

Code : Tout sélectionner

D ={}
Hdebut = D.cet('heuredebut',None)
Ensuite tu peu garder le principe de liste pour le nombre de scénario surtout si le nom n'est pas utile. Comme cela c'est plus facile à scruter

Donc en fait le mieux pour toi serai une liste de dictionnaire

J'espère t'avoir un peu mis sur la piste
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.

phdenaujan
Messages : 63
Enregistré le : lun. 5 janv. 2015 21:29

Re: Générer des variables

Message par phdenaujan » sam. 13 juin 2015 11:28

Salut,

Je ne connais par le format JSON. Au vu dès quelques lignes parcourues sur le net, ça me semble en effet être la solution. Je m'y penche et te fais un retour.

Merci pour ton aide,
Ph.

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

Re: Générer des variables

Message par Manfraid » sam. 13 juin 2015 22:00

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.

phdenaujan
Messages : 63
Enregistré le : lun. 5 janv. 2015 21:29

Re: Générer des variables

Message par phdenaujan » dim. 14 juin 2015 14:24

Voila le retour, ça fonctionne nickel mais m'oblige à revoir mes scripts de vérification PHP. Eh oui, ils utilisent les mêmes fichiers !

J'ai tenté de les générer en python, ça fonctionne également.

Code : Tout sélectionner

import os

numero = 0
dictionnaire = {} #Creation du dictionnaire principal

dossier = os.listdir ('config') #Scan du dossier contenant les fichiers
for sortie in dossier :
    if sortie.strip()[:6] == 'sortie': #Verifie que le fichier qui va être traité correpondant à un fichier commençant par "sortie"
        numero = numero+1
        dictionnaire['sortie'+str(numero)] = {} #Crée un dictionnaire correspondant au fichier à traiter
        fichier = open ("config/" +(sortie), "r")
        ligne = fichier.readlines()
        for (boucle, x) in enumerate (ligne) :
            ligne[boucle] = ligne[boucle][:-1] #Supprime le retour à la ligne
            if ligne[boucle] != '' : #Evite le platange si ligne vide dans le fichier
                donnee = (ligne[boucle]).split('/')
                if len(donnee) == 2 : #Verifie que la liste donnée est valide
                    dictionnaire['sortie'+str(numero)][donnee[0]]=donnee[1]
Ph.

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

Re: [Résolu] - Générer des variables

Message par Manfraid » dim. 14 juin 2015 15:11

tant mieux que tu ai trouver une solution
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 »