[Résolu] - Générer des variables
Modérateurs : Francois, Manfraid
-
- Messages : 63
- Enregistré le : lun. 5 janv. 2015 21:29
[Résolu] - Générer des variables
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,
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.
Re: Générer des variables
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
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.
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.
-
- Messages : 63
- Enregistré le : lun. 5 janv. 2015 21:29
Re: Générer des variables
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).
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.
Re: Générer des variables
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
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.
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.
-
- Messages : 63
- Enregistré le : lun. 5 janv. 2015 21:29
Re: Générer des variables
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 :
"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 !
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
Ç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.
Re: Générer des variables
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
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
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)
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.
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.
-
- Messages : 63
- Enregistré le : lun. 5 janv. 2015 21:29
Re: Générer des variables
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,
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.
Re: Générer des variables
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.
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.
-
- Messages : 63
- Enregistré le : lun. 5 janv. 2015 21:29
Re: Générer des variables
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.
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.
Re: [Résolu] - Générer des variables
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.
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.