Подтвердить что ты не робот

Техника Python или простая система шаблонов для вывода текстового текста

Я ищу технику или систему шаблонов для Python для форматирования вывода на простой текст. Я требую, чтобы он мог выполнять итерацию по нескольким спискам или диктофонам. Было бы неплохо, если бы я смог определить шаблон в отдельный файл (например, output.templ), а не жестко кодировать его в исходный код.

В качестве простого примера, чего я хочу достичь, мы имеем переменные title, subtitle и list

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

И запустив шаблон, вывод будет выглядеть так:

Foo
Bar

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

Как это сделать? Спасибо.

4b9b3361

Ответ 1

Существует довольно много шаблонных движков для python: Jinja, Cheetah, Genshi etc. Вы не ошибетесь ни с одним из них.

Ответ 2

Вы можете использовать стандартную библиотеку шаблон строки:

Итак, у вас есть файл foo.txt с

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

и словарь

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

Тогда это довольно просто

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

Затем вы можете распечатать src

Конечно, как сказал Джэммон, у вас есть много других хороших движков шаблонов (это зависит от того, что вы хотите сделать... стандартный шаблон строки, вероятно, самый простой)


Полный рабочий пример

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

Затем запустите example.py

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

Ответ 3

Если вы предпочитаете использовать что-то, поставляемое со стандартной библиотекой, посмотрите на синтаксис строки . По умолчанию он не может форматировать списки, как в вашем примере вывода, но вы можете справиться с этим с помощью настраиваемого Formatter, который переопределяет convert_field.

Предположим, что ваш пользовательский форматтер cf использует код преобразования l для форматирования списков, это должно привести к выдаче вашего данного примера:

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

В качестве альтернативы вы можете предварительно сформировать свой список, используя "\n".join(list), а затем передать это в свою обычную строку шаблона.

Ответ 4

Я не знаю, просто ли это, но Cheetah может помочь.

Ответ 5

Может кто-нибудь сказать, пожалуйста, что не так с этим? Я только начинаю в программировании. Я могу запустить скрипт, но результаты не отображаются. Я получаю ошибку, пожалуйста, помогите.

filein = open( 'IOS.j2' )
src = string.Template( filein.read() )
hostname = input("Enter the hostname: ")
subnet = input("Enter the third octet: ")
secret_type = input("Enter the secret_type: ")


d={ 'hostname':hostname, 'secret_type':secret_type }
result = src.substitute(d)


fileout = open( hostname + '.cfg', 'w' )
fileout.write(result)

Здесь ошибка

lib\string.py ", строка 105, в _invalid (lineno, colno)) ValueError: Неверный заполнитель в строке: строка 125, столбец 39