OVH Cloud OVH Cloud

Parser des chaînes de caractères

20 réponses
Avatar
Jerome
Bonjour,
je cherche à définir un petit formalisme de fichier de configuration
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]


Actuellement je connais plusieurs moyens de le faire mais je cherche des
moyens plus simples à mettre en oeuvre.

1/ Utiliser la fonction eval. Le problème est de devoir écrire la
structure en python, ce que je ne veux pas imposer.

2/ Utiliser un parsing à base de split. Difficile à maintenir et à étendre.

3/ Utiliser le module re. Plus simple que les split mais les regexp sont
vite complexes.

4/ Utiliser pyparsing. Je n'ai pas encore pu tester.


Est-ce que vous auriez d'autres pistes à me faire partager ou bien un
retour d'expérience ?


Merci,
Jérôme

10 réponses

1 2
Avatar
chris
Bonjour,
je cherche à définir un petit formalisme de fichier de configuration
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]


Actuellement je connais plusieurs moyens de le faire mais je cherche des
moyens plus simples à mettre en oeuvre.

1/ Utiliser la fonction eval. Le problème est de devoir écrire la
structure en python, ce que je ne veux pas imposer.

2/ Utiliser un parsing à base de split. Difficile à maintenir et à étendre.

3/ Utiliser le module re. Plus simple que les split mais les regexp sont
vite complexes.

4/ Utiliser pyparsing. Je n'ai pas encore pu tester.


Est-ce que vous auriez d'autres pistes à me faire partager ou bien un
retour d'expérience ?


Merci,
Jérôme


Voir json www.json.org
Voir yaml www.yaml.org

Les 2 sont bons et simple

il doit y en avoir d'autres mais je debute en python

A+
chris

Avatar
elGringo
On 19 fév, 10:15, Jerome wrote:
Bonjour,
je cherche à définir un petit formalisme de fichier de configurati on
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]

Actuellement je connais plusieurs moyens de le faire mais je cherche des
moyens plus simples à mettre en oeuvre.

1/ Utiliser la fonction eval. Le problème est de devoir écrire la
structure en python, ce que je ne veux pas imposer.

2/ Utiliser un parsing à base de split. Difficile à maintenir et à étendre.

3/ Utiliser le module re. Plus simple que les split mais les regexp sont
vite complexes.

4/ Utiliser pyparsing. Je n'ai pas encore pu tester.

Est-ce que vous auriez d'autres pistes à me faire partager ou bien un
retour d'expérience ?

Merci,
Jérôme


tu peux utiliser le module pickle (ou cPickle)

Avatar
elGringo
On 19 fév, 10:35, chris wrote:



Bonjour,
je cherche à définir un petit formalisme de fichier de configurat ion
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]

Actuellement je connais plusieurs moyens de le faire mais je cherche des
moyens plus simples à mettre en oeuvre.

1/ Utiliser la fonction eval. Le problème est de devoir écrire la
structure en python, ce que je ne veux pas imposer.

2/ Utiliser un parsing à base de split. Difficile à maintenir et à étendre.

3/ Utiliser le module re. Plus simple que les split mais les regexp sont
vite complexes.

4/ Utiliser pyparsing. Je n'ai pas encore pu tester.

Est-ce que vous auriez d'autres pistes à me faire partager ou bien un
retour d'expérience ?

Merci,
Jérôme


Voir jsonwww.json.org
Voir yamlwww.yaml.org

Les 2 sont bons et simple

il doit y en avoir d'autres mais je debute en python

A+
chris


il existe le module pickle (ou cPickle, plus rapide) qui permet de
serialiser des données dans un fichier texte en conservant leur type.


Avatar
Jerome
elGringo wrote:
On 19 fév, 10:15, Jerome wrote:
Bonjour,
je cherche à définir un petit formalisme de fichier de configuration
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]

Actuellement je connais plusieurs moyens de le faire mais je cherche des
moyens plus simples à mettre en oeuvre.

1/ Utiliser la fonction eval. Le problème est de devoir écrire la
structure en python, ce que je ne veux pas imposer.

2/ Utiliser un parsing à base de split. Difficile à maintenir et à étendre.

3/ Utiliser le module re. Plus simple que les split mais les regexp sont
vite complexes.

4/ Utiliser pyparsing. Je n'ai pas encore pu tester.

Est-ce que vous auriez d'autres pistes à me faire partager ou bien un
retour d'expérience ?

Merci,
Jérôme


tu peux utiliser le module pickle (ou cPickle)



oui mais le module pickle n'est pas adapté à un fichier de
configuration. Je veux pourvoir écrire le fichier à la main avec un
éditeur de texte en respectant une grammaire connue à l'avance. (même si
il est vrai que par défaut pickle utilise de l'ascii et peut donc être
un candidat)


Avatar
Laurent Pointal
Bonjour,
je cherche à définir un petit formalisme de fichier de configuration
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]


Actuellement je connais plusieurs moyens de le faire mais je cherche des
moyens plus simples à mettre en oeuvre.

1/ Utiliser la fonction eval. Le problème est de devoir écrire la
structure en python, ce que je ne veux pas imposer.

2/ Utiliser un parsing à base de split. Difficile à maintenir et à étendre.

3/ Utiliser le module re. Plus simple que les split mais les regexp sont
vite complexes.

4/ Utiliser pyparsing. Je n'ai pas encore pu tester.


Est-ce que vous auriez d'autres pistes à me faire partager ou bien un
retour d'expérience ?


Autre pise: utiliser ConfigObj
http://www.voidspace.org.uk/python/configobj.html

Vu ce que tu cherches à exprimer, YAML semblerais adapté.


Pour pyparsing, je suis en train de m'y mettre, c'est sympa, et rapide.
Manque une doc synthétique AMA (ou je ne l'ai pas trouvée). Par contre,
ça pourrais te permettre de réaliser rapidement ton module de lecture.


Précédemment, pour PyExp, j'avais fait un module de configuration
pouvant utiliser des fichiers textes, avec un format:
@XXXXX
[YYYYY]
ZZZZ=VVVV
(l'indentation n'est là que pour la lisibilité - le gros ajout était un
niveau hiérarchique de plus par rapport au format des fichiers à la ".ini").
Mais, sauf à avoir des besoins très spéciaux (typiquement dans PyExp
j'ai une couche d'abstraction qui permet éventuellement d'utiliser
d'autres backend de stockage que des fichiers textes), j'éviterais
autant que possible de réinventer ça.


J'ai une question par rapport à ton format désiré. Si tu supprime le
séparateur entre les valeurs, pourquoi le conserves-tu lorsque tu es
entre () et entre [] ?

Avatar
Jerome
Laurent Pointal wrote:
Bonjour,
je cherche à définir un petit formalisme de fichier de configuration
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]


Actuellement je connais plusieurs moyens de le faire mais je cherche des
moyens plus simples à mettre en oeuvre.

1/ Utiliser la fonction eval. Le problème est de devoir écrire la
structure en python, ce que je ne veux pas imposer.

2/ Utiliser un parsing à base de split. Difficile à maintenir et à étendre.

3/ Utiliser le module re. Plus simple que les split mais les regexp sont
vite complexes.

4/ Utiliser pyparsing. Je n'ai pas encore pu tester.


Est-ce que vous auriez d'autres pistes à me faire partager ou bien un
retour d'expérience ?


Autre pise: utiliser ConfigObj
http://www.voidspace.org.uk/python/configobj.html

Vu ce que tu cherches à exprimer, YAML semblerais adapté.


En regardant rapidement, je n'ai pas vraiment accroché à la syntaxe qui
me semble "lourde visuellement". Mais je dois encore regarder plus
précisement



Pour pyparsing, je suis en train de m'y mettre, c'est sympa, et rapide.
Manque une doc synthétique AMA (ou je ne l'ai pas trouvée). Par contre,
ça pourrais te permettre de réaliser rapidement ton module de lecture.


oui, c'est un bon candidat potentiel, avec Spark qu'un collègue vient de
me recommander.



Précédemment, pour PyExp, j'avais fait un module de configuration
pouvant utiliser des fichiers textes, avec un format:
@XXXXX
[YYYYY]
ZZZZ=VVVV
(l'indentation n'est là que pour la lisibilité - le gros ajout était un
niveau hiérarchique de plus par rapport au format des fichiers à la ".ini").
Mais, sauf à avoir des besoins très spéciaux (typiquement dans PyExp
j'ai une couche d'abstraction qui permet éventuellement d'utiliser
d'autres backend de stockage que des fichiers textes), j'éviterais
autant que possible de réinventer ça.


J'ai une question par rapport à ton format désiré. Si tu supprime le
séparateur entre les valeurs, pourquoi le conserves-tu lorsque tu es
entre () et entre [] ?



Les espaces servent à séparer les différents types de donnés, les
virgules à séparer les valeurs dans les types (certaines peuvent être
absentes). Je veux être assez souple s'il manque un espace ou s'il y a
des tabulations par exemple.

Pour clarifier voici un pseudocode de ce que je voudrais écrire, coté
parsing, qui correspond à ce que j'ai déjà avec mes regexp

analyse = parse(ma_string)
for el in analyse:
if analyse.type == 'simple':
traitement_simple(analyse)
elif analyse.type == 'tuple':
traitement_tuple(analyse)
elif analyse.type == 'interval':
traitement_interval(analyse)


Avatar
Laurent Pointal
Laurent Pointal wrote:
Bonjour,
je cherche à définir un petit formalisme de fichier de configuration
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]
<zip>



J'ai une question par rapport à ton format désiré. Si tu supprime le
séparateur entre les valeurs, pourquoi le conserves-tu lorsque tu es
entre () et entre [] ?



Les espaces servent à séparer les différents types de donnés, les
virgules à séparer les valeurs dans les types (certaines peuvent être
absentes). Je veux être assez souple s'il manque un espace ou s'il y a
des tabulations par exemple.


Gaffe, côté configuration, que ça ne soit pas trop lourd pour
l'utilisateur. Non pas difficile à saisir (là ta syntaxe est réduite et
facile à retenir), mais au contraire difficile à retenir à quoi
correspond chaque valeur (sémantique).



Avatar
Pierre Quentel
On 19 fév, 10:15, Jerome wrote:
Bonjour,
je cherche à définir un petit formalisme de fichier de configurati on
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]

(...)

Est-ce que vous auriez d'autres pistes à me faire partager ou bien un
retour d'expérience ?

Merci,
Jérôme


Bonjour,

La solution standard en Python pour les fichiers de configuration est
d'utiliser le module ConfigParser

L'utilisateur édite un fichier texte (disons config.txt) du genre :

[MesOptions]
values = 12,23,45
val1 = (12, 34, 44.5)
val2 = [23,45.3]

C'est plus lisible que ce que tu proposes avec toutes les valeurs sur
une seule ligne, et l'utilisateur n'a pas besoin de connaître Python

Le programme exploite les valeurs de cette façon :

import ConfigParser
conf = ConfigParser.ConfigParser()
conf.read("config.txt")

values = conf.get("MesOptions","values").split(",")
val1 = eval(conf.get("MesOptions","val1"))
val2 = eval(conf.get("MesOptions","val2"))

values est une liste de chaînes de caractères, val1 un tuple, val2 une
liste

Pour avoir des valeurs entières dans values :

values = [ int(v) for v in
conf.get("MesOptions","values").split(",") ]

A+
Pierre

Avatar
Jerome
Pierre Quentel wrote:
On 19 fév, 10:15, Jerome wrote:
Bonjour,
je cherche à définir un petit formalisme de fichier de configuration
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]

(...)

Est-ce que vous auriez d'autres pistes à me faire partager ou bien un
retour d'expérience ?

Merci,
Jérôme


Bonjour,

La solution standard en Python pour les fichiers de configuration est
d'utiliser le module ConfigParser


Oui, je l'utilise déjà. Et c'est pour cela que je dois utiliser des
méthodes plus complexes car les valeurs ne peuvent être que des chaines
de caractères.


L'utilisateur édite un fichier texte (disons config.txt) du genre :

[MesOptions]
values = 12,23,45
val1 = (12, 34, 44.5)
val2 = [23,45.3]

C'est plus lisible que ce que tu proposes avec toutes les valeurs sur
une seule ligne, et l'utilisateur n'a pas besoin de connaître Python


Cela impose d'avoir 3 options pour les sections, dont certaines non
présentes. Ce qui, dans l'utilisation que je fais des fichiers de
configuration, est plutôt contraignant à gérer. Pour simplifier, la
sémantique de l'option 'values' dépend d'une autre option 'action'. Pour
l'utilisateur, il s'agit de définir l'action et les paramètres associés
via le champ values.



A+
Pierre




Avatar
Paul Morelle
Bonjour,
je cherche à définir un petit formalisme de fichier de configuration
qui me permettra de stocker facilement des informations structurées
(tuples, listes, ...) dans des fichiers textes.

par exemple :
"values = 12 23 (12, 34, 44.5) 45 [23,45.3]" dans le fichier texte me
donne trois choses différentes :
- des valeurs spécifiques 12, 23, 45
- un tuple de 3 valeurs : (12, 34, 44.5)
- un intervalle : [23, 45.3]


Actuellement je connais plusieurs moyens de le faire mais je cherche des
moyens plus simples à mettre en oeuvre.

1/ Utiliser la fonction eval. Le problème est de devoir écrire la
structure en python, ce que je ne veux pas imposer.

2/ Utiliser un parsing à base de split. Difficile à maintenir et à étendre.

3/ Utiliser le module re. Plus simple que les split mais les regexp sont
vite complexes.

4/ Utiliser pyparsing. Je n'ai pas encore pu tester.


Est-ce que vous auriez d'autres pistes à me faire partager ou bien un
retour d'expérience ?


Merci,
Jérôme


Salut,

Tu peux aussi modifier un peu ton fichier de configuration :

values = (12, 23, (12, 34, 44.5), 45, [23, 45.3])

Ensuite, tu n'as qu'à faire évaluer le fichier par python, et tu
retrouves un tuple où tu peux retrouver les différents champs comme dans
un tableau.

Paul

1 2