web-dev-qa-db-fra.com

Python technique ou système de modèle simple pour la sortie de texte brut

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.

53
Gargauth

Il existe un certain nombre de moteurs de modèles pour python: Jinja , Cheetah , Genshietc . Vous ne ferez aucune erreur avec aucun d'entre eux.

11
jammon

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)


Exemple de travail complet

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
174
ThibThib

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.

14
Oben Sonne

Je ne sais pas si c'est simple, mais Cheetah pourrait être utile.

0
Jeannot