Python3.2 Str.format值重复

时间:2011-05-04 22:26:31

标签: python string format

我正在为程序生成特定格式的输入文件,并使用一个小的python tkinter GUI前端来执行此操作。旧代码使用了fortran格式语句。除非已经有一个python的直接转换函数集(我还没有找到),我认为python的格式化可以完成这项工作。一般情况下它可以,但我找不到重复某个值的方法:

例如,在fortran:

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, 克里斯。

修改 以下是我目前正在做的更明确的例子:

>>> ---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 个答案:

答案 0 :(得分:4)

正如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

答案 1 :(得分:2)

您可以像这样生成部分格式字符串(根据需要进行调整):

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

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

或甚至更喜欢'%i '*10(更简洁,如果你不介意最后的额外分隔符值)

修改 上面的内容已被弃用,原始海报需要一个明确的示例,因此这里有一个使用http://docs.python.org/library/stdtypes.html#str.format中指定格式的str.format(http://docs.python.org/library/string.html#formatstrings)的显式示例。请注意,您可以执行比此演示更复杂的操作,例如使用nice关键字参数甚至是对象属性。见文档。

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'

(编辑2:向ncoghlan道歉;我在更新前没有看到他的新答案)