Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3.2 Str.format值重复_Python_String_Format - Fatal编程技术网

Python3.2 Str.format值重复

Python3.2 Str.format值重复,python,string,format,Python,String,Format,我正在为一个程序生成专门格式化的输入文件,并使用一个小型的python tkinter GUI前端来实现这一点。旧代码使用fortran格式的语句。除非已经有了python的直接转换函数集(我还没有找到),否则我认为python的格式化可以完成这项工作。一般来说可以,但我找不到一种方法来重复某个值: 例如,在fortran中: FORMAT (2A1, I3, **12I5**, F8.3, A7). The "12I5" statement translates to 12 integer v

我正在为一个程序生成专门格式化的输入文件,并使用一个小型的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
我希望能够

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

您可以像这样生成部分格式字符串(视情况而定):

或者甚至像
'%i'*10
(如果您不介意在末尾添加一个额外的分隔符值,请更简洁)

编辑: 上面的内容已被弃用,原始海报希望有一个明确的示例,因此这里有一个str.format()的明确示例,使用中指定的格式。注意,您可以做比这个演示更复杂的事情,比如使用漂亮的关键字参数,甚至对象属性。见文件

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道歉;在更新之前,我没有看到他的新答案)

正如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的%语法,这很好地澄清了问题,谢谢各位。你们可以感谢Raymond Hettinger为我介绍了这个特殊的技巧。%格式语法实际上是“旧式”(Python2.x)格式,3.x保留了这种格式,因为删除它是一个向后兼容性的噩梦,但对于这样的情况,它确实很方便。
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