Python3.2 Str.format值重复

5
我正在为一个程序生成特定格式的输入文件,并使用小型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示例一样。
我是否错过了什么,或者这不可能,我必须明确地写出每个格式项?
-谢谢, 克里斯。
编辑 以下是我目前正在做的更清晰的示例:
>>> ---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

I'd like to be able to

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

太棒了。我真的不知道Python中的%语法,这很好地解决了问题,谢谢大家。 - Ponml
你可以感谢Raymond Hettinger介绍给我那个特殊的技巧。%-格式语法实际上是“旧式”(Python 2.x)格式化,因为删除它会带来向后兼容性的噩梦,所以保留了它,并且确实在像这样的情况下非常方便。 - ncoghlan

2
您可以这样生成部分格式字符串(根据需要进行适当调整):
>>> ','.join(['%s']*5)
'%s,%s,%s,%s,%s'

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

甚至可以像'%i '*10这样(如果您不介意在末尾添加额外的分隔符值,则更加简洁)

编辑: 上述内容已被弃用,原帖作者想要一个明确的示例,因此这里提供了一个使用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'

(编辑2:向ncoghlan道歉;在更新之前我没有看到他的新答案)
抱歉,我的翻译需要一些上下文才能更好地进行。请提供完整的原始文本以便我能够帮助您。

谢谢您的快速回复,但我不太确定那如何与我现在所做的相符。我编辑了我的帖子以展示目前的情况。 - Ponml

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接