templates string - Tecnica Python o semplice sistema di template per output di testo normale




jinja2 render (5)

Sto cercando una tecnica o un sistema di template per Python per la formattazione di output in testo semplice. Quello che chiedo è che sarà in grado di scorrere attraverso più elenchi o dict. Sarebbe bello se potessi definire il modello in un file separato (come output.templ) invece di codificarlo nel codice sorgente.

Come semplice esempio di ciò che voglio ottenere, abbiamo variabili title , subtitle e list

title = 'foo'
subtitle = 'bar'
list = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

E passando attraverso un modello, l'output sarebbe simile a questo:

Foo
Bar

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

Come fare questo? Grazie.


Answers

Se preferisci utilizzare qualcosa fornito con la libreria standard, dai un'occhiata alla sintassi della stringa di formato . Di default non è in grado di formattare liste come nel tuo esempio di output, ma puoi gestirlo con un formattatore personalizzato che sovrascrive il metodo convert_field .

Supposto che il tuo formattatore personalizzato cf usi il codice di conversione l per formattare gli elenchi, questo dovrebbe produrre il tuo esempio di output:

cf.format("{title}\n{subtitle}\n\n{list!l}", title=title, subtitle=sibtitle, list=list)

In alternativa puoi preformare il tuo elenco usando "\n".join(list) e quindi passare questo alla normale stringa del template.


Non so se sia semplice, ma il Cheetah potrebbe essere d'aiuto.


È possibile utilizzare il modello di stringa di libreria standard:

Quindi hai un file foo.txt con

$title
...
$subtitle
...
$list

e un dizionario

d={ 'title':title, 'subtitle':subtitle, 'list':'\n'.join(list) }

Quindi è abbastanza semplice

from string import Template
#open the file
filein = open( 'foo.txt' )
#read it
src = Template( filein.read() )
#do the substitution
src.substitute(d)

Quindi puoi stampare src

Ovviamente, come ha detto Jammon, hai molti altri buoni motori di template (dipende da cosa vuoi fare ... il template standard è probabilmente il più semplice)

Pieno esempio di lavoro

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

Quindi esegui example.py

$ python example.py
This is the title
...
And this is the subtitle
...
first
second
third

Ci sono un discreto numero di template engine per python: Jinja , Cheetah , Genshi etc . Non commetterai un errore con nessuno di loro.


Ordinamento e groupby

from itertools import groupby

val = [{'name': 'satyajit', 'address': 'btm', 'pin': 560076}, 
       {'name': 'Mukul', 'address': 'Silk board', 'pin': 560078},
       {'name': 'Preetam', 'address': 'btm', 'pin': 560076}]


for pin, list_data in groupby(sorted(val, key=lambda k: k['pin']),lambda x: x['pin']):
...     print pin
...     for rec in list_data:
...             print rec
... 
o/p:

560076
{'name': 'satyajit', 'pin': 560076, 'address': 'btm'}
{'name': 'Preetam', 'pin': 560076, 'address': 'btm'}
560078
{'name': 'Mukul', 'pin': 560078, 'address': 'Silk board'}




python templates