Je suis à la recherche d'une technique ou d'un système de modèles pour Python pour le formatage de la sortie en texte simple. Ce dont j'ai besoin, c'est qu'il pourra parcourir plusieurs listes ou dict. Il serait bien si je serait en mesure de définir le modèle dans un fichier séparé (comme output.templ) au lieu de le coder en dur dans le code source.
Comme exemple simple de ce que je veux réaliser, nous avons les variables title
, subtitle
et list
title = 'foo'
subtitle = 'bar'
list = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
Et en parcourant un modèle, la sortie ressemblerait à ceci:
Foo
Bar
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Comment faire ça? Merci.
Vous pouvez utiliser la bibliothèque standard modèle de chaîne :
Vous avez donc un fichier foo.txt
avec
$title
...
$subtitle
...
$list
et un dictionnaire
d={ 'title':title, 'subtitle':subtitle, 'list':'\n'.join(list) }
Alors c'est assez simple
from string import Template
#open the file
filein = open( 'foo.txt' )
#read it
src = Template( filein.read() )
#do the substitution
src.substitute(d)
Ensuite, vous pouvez imprimer src
Bien sûr, comme l'a dit Jammon, vous avez beaucoup d'autres bons moteurs de modèles (cela dépend de ce que vous voulez faire ... le modèle de chaîne standard est probablement le plus simple)
foo.txt
$title
...
$subtitle
...
$list
example.py
from string import Template
#open the file
filein = open( 'foo.txt' )
#read it
src = Template( filein.read() )
#document data
title = "This is the title"
subtitle = "And this is the subtitle"
list = ['first', 'second', 'third']
d={ 'title':title, 'subtitle':subtitle, 'list':'\n'.join(list) }
#do the substitution
result = src.substitute(d)
print result
Exécutez ensuite example.py
$ python example.py
This is the title
...
And this is the subtitle
...
first
second
third
Si vous préférez utiliser quelque chose livré avec la bibliothèque standard, jetez un œil à la format string syntax . Par défaut, il n'est pas en mesure de formater les listes comme dans votre exemple de sortie, mais vous pouvez gérer cela avec un Formatter personnalisé qui remplace la méthode convert_field
.
Supposons que votre formateur personnalisé cf
utilise le code de conversion l
pour formater les listes, cela devrait produire votre exemple de sortie donné:
cf.format("{title}\n{subtitle}\n\n{list!l}", title=title, subtitle=sibtitle, list=list)
Vous pouvez également pré-formater votre liste à l'aide de "\n".join(list)
, puis la transmettre à votre chaîne de modèle normale.
Je ne sais pas si c'est simple, mais Cheetah pourrait être utile.