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

为什么我不能在变量python的开头设置字符串格式,python,Python,为什么这样做有效: with open(filename+'%s' % i, "w") 但这并不是: with open('%s'+filename % i, "w") 每次文件名循环通过时,我想在文件名的开头添加I的编号。但是在末尾添加它会将数字添加到扩展示例-filname.xml0中%运算符比+运算符有一个值,它首先应用 Python执行: filename + ('%s' % i) 在第一种情况下,以及 '%s' + (filename % i) 在第二个 您可以添加括号来替代此

为什么这样做有效:

with open(filename+'%s' % i, "w")
但这并不是:

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

每次文件名循环通过时,我想在文件名的开头添加I的编号。但是在末尾添加它会将数字添加到扩展示例-filname.xml0

%
运算符比
+
运算符有一个值,它首先应用

Python执行:

filename + ('%s' % i)
在第一种情况下,以及

'%s' + (filename % i)
在第二个

您可以添加括号来替代此选项:

('%s' + filename) % i
或者您可以将
filename
i
插入模板:

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

如果您使用的是Python3.6或更高版本,那么您应该真正使用a来完成相同的工作;这些表达式要快得多:

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

注意字符串的
f
前缀,
{}
槽中包含表达式的结果。我认为这也更清晰易读。

运算符优先级意味着
%
的优先级高于
+

所以

相当于:

with open('%s' + (filename % i), "w")
你可以加括号:

with open(('%s'+filename) % i, "w")
但是,如果文件名包含一个文本
%
字符,则会出现可怕的错误

因此,对以下两种情况都使用字符串格式:

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

或者只是连接字符串:

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

操作优先级是个问题,只需添加如下括号:

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

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

乘法运算符
*
/
/
%
的优先级高于加法运算符
+
-
%
基本上仍然是模运算符,即使在字符串插值中使用它时它执行不同的工作,因此它仍然具有通常的优先级。
with open(str(i) + filename, "w")
with open(('%s'+filename) % i, "w")