Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[ConfigParser] conserver les espaces dans des valeurs multilignes

15 réponses
Avatar
Olivier Miakinen
Bonjour,

J'ai une question Í  propos du module configparser. Après lecture attentive
de la doc je pense que la réponse sera non, mais j'espère me tromper.

Je voudrais savoir s'il est possible de ne pas perdre les espaces au début
de chaque ligne dans une valeur multiligne. Je donne un exemple :

Contenu du fichier lu par ConfigParser.read() :
================================[global]
filtre = AND
OR
AND
a
b
AND
c
================================
Résultat de print(config.get('global', 'filtre')) :
================================AND
OR
AND
a
b
AND
c
================================
J'aurais souhaité avoir quelque chose comme :
================================AND
OR
AND
a
b
AND
c
================================

Cordialement,
--
Olivier Miakinen

5 réponses

1 2
Avatar
Nicolas
Le 01/06/2021 Í  20:16, Olivier Miakinen a écrit :
Le 01/06/2021 09:21, Nicolas a écrit :
Une idée qui me vient comme ça : Est-ce qu'une chaine json serait
adaptée Í  ce que tu veux faire ? Ca aurait l'intérêt d'être plus
universel et non dépendant de l'indentation.

J'avais regardé JSON, et c'est moins adapté que configparser pour
plusieurs raisons. En particulier, tout comme TOML ou YAML, c'est le
fichier de config qui détermine le type des données. Alors c'est très
adapté comme format d'échange entre deux programmes, y compris sur
des architectures différentes, mais ça ne correspond pas Í  mon besoin.

Je ne vois pas o͹ il est question de type de données dans ta description
du problème. Tu écris/lis des chaines de caractères dans un fichier.
Ensuite, libre Í  toi d'interpréter ces chaines de caractères comme tu
l'entends. Ce que tu fais déjÍ  avec ton propre parseur...

Ah oui, tu veux dire que je pourrais utiliser un format TOML ou JSON
dans lequel toutes les données seraient des chaÍ®nes de caractères, donc
sans utiliser la possibilité d'exprimer des tableaux ou des dictionnaires
par exemple ?

Tu peux très bien utiliser des dictionnaires et des listes pour faire
les regroupements logiques dont tu as besoin.
En Python :
{"OR" : [{"from" : "/un spammeur /"},
{"from" : "/autre spammeur
/"},
{"AND" : [{"from" : "/un autre encore /"},
{"!" : "message-id //"},
{"!" : "message-id //"}
]
},
{"subject" : "/solution.? manual/i"}
]
}
Du coup je trouve dommage d'ajouter de la complexité (avec guillemets et
accolades) si c'est pour sous-utiliser les possibilités du format. D'autant
plus que mon seul problème concernait *un* type de données parmi tous ceux
que j'utilise,

Pas de complexité, bien au contraire, si tu utilises les fonctions de
conversion Python/JSON et JSON/Python de la bibliothèque standard.
C'est même plus facile, que de parser un morceaux de fichier
manuellement. Au chargement, tu récupères une structure de données
Python (dict et list) toute cuite. A l'écriture, tu écris la chaine JSON
dans le fichier de config.
et que je l'ai résolu d'une façon qui préserve la philosophie
de python (l'indentation pour indiquer la struture). La seule différence
c'est que j'indente avec un choix de caractères qui ajoute le « | » aux
seules espaces et tabulations.

Ce n'est pas parce que les sources Python utilisent l'indentation pour
marquer les blocs de code que les fichiers de données doivent être sur
le même principe. Et heureusement.
Avatar
Olivier Miakinen
Le 02/06/2021 08:39, Nicolas a écrit :

Je ne vois pas o͹ il est question de type de données dans ta description
du problème. Tu écris/lis des chaines de caractères dans un fichier.
Ensuite, libre Í  toi d'interpréter ces chaines de caractères comme tu
l'entends. Ce que tu fais déjÍ  avec ton propre parseur...

Ah oui, tu veux dire que je pourrais utiliser un format TOML ou JSON
dans lequel toutes les données seraient des chaÍ®nes de caractères, donc
sans utiliser la possibilité d'exprimer des tableaux ou des dictionnaires
par exemple ?

Tu peux très bien utiliser des dictionnaires et des listes pour faire
les regroupements logiques dont tu as besoin.

Oui, mais alors c'est le fichier de config qui détermine le type de donnée.
Un dictionnaire ou une liste, ce n'est pas une chaÍ®ne de caractères. Et
͠ partir du moment o͹ je laisse le fichier de config libre de mettre un
dictionnaire au lieu d'une string, il peut aussi y mettre un entier ou
un booléen, y compris Í  l'intérieur du troisième niveau d'un dictionnaire.
En Python :
{"OR" : [{"from" : "/un spammeur /"},
{"from" : "/autre spammeur
/"},
{"AND" : [{"from" : "/un autre encore /"},
{"!" : "message-id //"},
{"!" : "message-id //"}
]
},

Autre problème de JSON (qui n'existait pas avec TOML, et bien sÍ»r pas avec
INI), c'est qu'il est beaucoup plus compliqué de passer de :
{"from" : "/un autre encore /"},
Í  :
{"AND" : [{"from" : "/un autre encore /"},
{"!" : "message-id //"},
{"!" : "message-id //"}
que de :
from /un autre encore /
Í  :
AND
| from /un autre encore /
| # on exclut deux MID
| ! message-id //
| ! message-id //
(Í  la main, avec un simple éditeur de texte)
Sans compter que c'est moins lisible Í  cause de tout ce sucre syntaxique
autour (accolades, guillemets, deux-points, crochets et virgules).
Et o͹ sont passé mes commentaires ?
Du coup je trouve dommage d'ajouter de la complexité (avec guillemets et
accolades) si c'est pour sous-utiliser les possibilités du format. D'autant
plus que mon seul problème concernait *un* type de données parmi tous ceux
que j'utilise,

Pas de complexité, bien au contraire, si tu utilises les fonctions de
conversion Python/JSON et JSON/Python de la bibliothèque standard.

Je ne parle pas de complexité de programmation ! Le programme je l'ai déjÍ 
écrit, et il fonctionne très bien, merci.
Je parle de la complexité Í  l'utilisation, quand je découvre un nouveau
spammeur, ou que je veux faire une recherche rapide sur un certain type
d'articles. Si je dois me payer une erreur de syntaxe parce que j'ai oublié
une virgule ou mis une accolade au mauvais endroit, je perds du temps.
C'est même plus facile, que de parser un morceaux de fichier
manuellement. Au chargement, tu récupères une structure de données
Python (dict et list) toute cuite.

Avec donc le type de données imposé par le fichier de config.
A l'écriture, tu écris la chaine JSON dans le fichier de config.

L'écriture se fait Í  la mimine avec un éditeur de texte, voire dans certains
cas en ligne de commande. Ce n'est jamais le programme qui l'écrit.
et que je l'ai résolu d'une façon qui préserve la philosophie
de python (l'indentation pour indiquer la struture). La seule différence
c'est que j'indente avec un choix de caractères qui ajoute le « | » aux
seules espaces et tabulations.

Ce n'est pas parce que les sources Python utilisent l'indentation pour
marquer les blocs de code que les fichiers de données doivent être sur
le même principe. Et heureusement.

Oui, bien sͻr. Mais ce n'est pas non plus une raison pour ne *pas* utiliser
le même principe pour les fichiers de données quand ceux-ci sont écrits Í  la
main, et que c'est plus facile Í  faire comme ça.
--
Olivier Miakinen
Avatar
Nicolas
Le 02/06/2021 Í  09:59, Olivier Miakinen a écrit :
...
A l'écriture, tu écris la chaine JSON dans le fichier de config.

L'écriture se fait Í  la mimine avec un éditeur de texte, voire dans certains
cas en ligne de commande. Ce n'est jamais le programme qui l'écrit.

Ah, ça ne faisait pas partie du cahier des charges ;)
Mais dans ce cas, pourquoi vouloir utiliser un fichier .ini qui utilise
un formatage qui ne te convient pas (tu es obligé de rajouter des | pour
palier au problème) ?
...
Nicolas
Avatar
Olivier Miakinen
Le 02/06/2021 10:26, Nicolas a écrit :
A l'écriture, tu écris la chaine JSON dans le fichier de config.

L'écriture se fait Í  la mimine avec un éditeur de texte, voire dans certains
cas en ligne de commande. Ce n'est jamais le programme qui l'écrit.

Ah, ça ne faisait pas partie du cahier des charges ;)

Au départ, la question était seulement « peut-on conserver les espaces dans
des valeurs multilignes avec ConfigParser ». Je n'ai demandé Í  personne de
concevoir le programme Í  ma place. ;-)
Mais dans ce cas, pourquoi vouloir utiliser un fichier .ini qui utilise
un formatage qui ne te convient pas (tu es obligé de rajouter des | pour
palier au problème) ?

Le format du fichier .ini était déjÍ  parfait pour mes besoins Í  tous points
de vue, pour tous les types de données (y compris les booléens que je peux
écrire indifféremment 'yes'-'no', 'on'-'off', 'true'-'false' ou '1'-'0'),
Í  l'exception du filtre.
Au prix d'un infime modification de mon format, qui rend d'ailleurs le filtre
encore plus lisible qu'avant, le format du fichier .ini est parfait pour tous
les types de données sans aucune exception.
Comme on m'a proposé d'autres choix j'ai voulu évaluer honnêtement l'intérêt
mais aussi les inconvénients de ces autres choix. D'ailleurs je ne le regrette
pas car il est toujours intéressant de réfléchir Í  d'autres possibilités
auxquelles on n'aurait pas pensé de prime abord. Et je te remercie très
sincèrement pour cela, ainsi que Julien et Alain.
Mais maintenant je peux marquer mon problème [RÉSOLU] puisque c'est le cas.
Cordialement,
--
Olivier Miakinen
Avatar
Nicolas
Le 02/06/2021 Í  11:23, Olivier Miakinen a écrit :
Le 02/06/2021 10:26, Nicolas a écrit :
A l'écriture, tu écris la chaine JSON dans le fichier de config.

L'écriture se fait Í  la mimine avec un éditeur de texte, voire dans certains
cas en ligne de commande. Ce n'est jamais le programme qui l'écrit.

Ah, ça ne faisait pas partie du cahier des charges ;)

Au départ, la question était seulement « peut-on conserver les espaces dans
des valeurs multilignes avec ConfigParser ». Je n'ai demandé Í  personne de
concevoir le programme Í  ma place. ;-)

Tout Í  fait.
Comme on m'a proposé d'autres choix j'ai voulu évaluer honnêtement l'intérêt
mais aussi les inconvénients de ces autres choix. D'ailleurs je ne le regrette
pas car il est toujours intéressant de réfléchir Í  d'autres possibilités
auxquelles on n'aurait pas pensé de prime abord. Et je te remercie très
sincèrement pour cela, ainsi que Julien et Alain.

Déformation professionnelle. Derrière toute question se cache une autre
question : "Pour quoi faire ?"
Régulièrement, cela débouche sur une solution qui n'a rien Í  voir avec
la question d'origine.
Mais maintenant je peux marquer mon problème [RÉSOLU] puisque c'est le cas.

:)
Cordialement,

Nicolas
1 2