为什么我不能在变量python的开头做字符串格式化

时间:2018-02-08 12:36:42

标签: python

为什么这样做:

with open(filename+'%s' % i, "w")

但这并不是:

with open('%s'+filename % i, "w")

我想在每次循环时将i的数量添加到文件名的开头。但是在最后添加它会将数字添加到扩展示例 - filname.xml0

3 个答案:

答案 0 :(得分:3)

%运算符的higher operator precedence运算符比+运算符高,首先应用

Python执行:

filename + ('%s' % i)

在第一种情况下,

'%s' + (filename % i)

在第二个。

您可以添加括号来覆盖它:

('%s' + filename) % i

或者您可以将filenamei插入到模板中:

'%s%s' % (i, filename)

这样做的另一个好处是,文件名中的任何%个字符都不会被视为特殊字符(这会导致问题)。

如果您使用的是Python 3.6或更高版本,则应该使用formatted string literal来执行相同的工作;这些表达式更快:

with open(f'{i}{filename}', 'w') as fileobj:

请注意字符串的f前缀,{}个插槽中填充了其中包含的表达式的结果。我认为这也更清晰,更具可读性。

答案 1 :(得分:2)

操作员优先级表示%的优先级高于+

所以

with open('%s'+filename % i, "w")

相当于:

with open('%s' + (filename % i), "w")

你可以括起来:

with open(('%s'+filename) % i, "w")

但如果文件名包含文字%字符,则会出现严重错误。

因此,请对两者使用字符串格式:

with open('%s%s' % (filename, i), "w")

with open('{}{}'.format(filename, i), "w")

或只是连接字符串:

with open(str(i) + filename, "w")

答案 2 :(得分:0)

操作优先级是问题简单地添加括号如下:

with open(('%s'+filename) % i, "w")

否则,您首先尝试使用filename格式化i,然后才将结果添加到%s