Python3.2 Str.format 值重复问题

5 投票
2 回答
989 浏览
提问于 2025-04-16 17:01

我正在为一个程序生成特定格式的输入文件,并使用一个简单的Python tkinter图形界面来完成这项工作。以前的代码使用了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示例那样简化。

我是不是漏掉了什么,还是说这不可能,我必须逐个写出格式中的每个项目?

-祝好,
Chris。

编辑
这是我目前正在做的一个更清晰的例子:

>>> ---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 个回答

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 表示歉意;在更新之前我没有看到他的新回答)

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

撰写回答