Повторение значения в Python3.2 Str.format - PullRequest
5 голосов
/ 05 мая 2011

Я генерирую специально отформатированные входные файлы для программы и использую для этого небольшой графический интерфейс Python tkinter.В старом коде использовались операторы формата Фортран.Если нет уже прямого набора функций преобразования для Python (который я не нашел), я подумал, что форматирование Python сделает эту работу.В целом это возможно, но я не могу найти способ повторения определенного значения:

Например, на фортране:

FORMAT (2A1, I3, **12I5**, F8.3, A7). The "12I5" statement translates to 12 integer values of width 5.

Я знаю, что у меня могло бы быть 12 текстовых элементовв моем вызове формата (например: ...{0:5d}, {1:5d}, {2:5d}....), но мне было интересно, есть ли способ получить упрощенную форму, как в приведенном выше примере с Fortran.

Есть что-то, что я пропустил, или это невозможно, и ядолжен явно записывать каждый элемент в формате?

-Cheers, Крис.

edit Вот более четкий пример того, что я сейчас делаю:

>>> ---tester = ["M", "T", 1111, 2222, 234.23456, "testing"]    
>>> ---fmt = "{0:1}{1:1}, {2:3d}, {3:5d}, {4:8.3F}, {5:>7}"    
>>> ---print(fmt.format(*tester))    
MT,  13,  1234,  234.235, testing

Я бы хотел иметь возможность

>>> ---tester = ["M", "T", 1111, **2222, 3333, 4444**, 234.23456, "testing"]    
>>> ---fmt = "{0:1}{1:1}, {2:3d}, **3*{3:5d}**, {4:8.3F}, {5:>7}"    
>>> ---print(fmt.format(*tester))       

Ответы [ 2 ]

4 голосов
/ 05 мая 2011

Как предположил ninjagecko, вы хотите построить строку формата по частям.

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

subfmt = ", ".join(["{:5d}"]*3)
fmt = "{:1}{:1}, {:3d}, %s, {:8.3F}, {:>7}" % subfmt
tester = ["M", "T", 1111, 2222, 3333, 4444, 234.23456, "testing"]

>>> print(fmt)
{:1}{:1}, {:3d}, {:5d}, {:5d}, {:5d}, {:8.3F}, {:>7}
>>> print(fmt.format(*tester))
MT, 1111,  2222,  3333,  4444,  234.235, testing
2 голосов
/ 05 мая 2011

Вы можете сгенерировать часть вашей строки формата следующим образом (адаптируйте по своему усмотрению):

>>> ','.join(['%s']*5)
'%s,%s,%s,%s,%s'

>>> ','.join(['%i']*5) % (1,2,3,4,5)
'1,2,3,4,5'

или даже как '%i '*10 (более кратко, если вы не возражаете против дополнительного значения разделителя)в конце)

edit: вышеупомянутое устарело, и оригинальный постер хотел бы явного примера, так что вот явный пример с str.format (http://docs.python.org/library/stdtypes.html#str.format) используя формат, указанный в http://docs.python.org/library/string.html#formatstrings.Обратите внимание, что вы можете делать намного более сложные вещи, чем эта демонстрация, например, используя хорошие аргументы ключевых слов или даже атрибуты объекта.См. Документы.

tester = ["M", "T", 1111, 2222, 3333, 4444, 234.23456, "testing"]
fmt = "{}{}, {:3d}, " + 3*"{:5d}, " + "{:8.3F}, {:>7}"
fmt.format(*tester)

результат:

'MT, 1111,  2222,  3333,  4444,  234.235, testing'

(edit2: с извинениями перед ncoghlan; я не видел его новый ответ перед обновлением)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...