为什么这样做:
with open(filename+'%s' % i, "w")
但这并不是:
with open('%s'+filename % i, "w")
我想在每次循环时将i的数量添加到文件名的开头。但是在最后添加它会将数字添加到扩展示例 - filname.xml0
答案 0 :(得分:3)
%
运算符的higher operator precedence运算符比+
运算符高,首先应用。
Python执行:
filename + ('%s' % i)
在第一种情况下,
'%s' + (filename % i)
在第二个。
您可以添加括号来覆盖它:
('%s' + filename) % i
或者您可以将filename
和i
插入到模板中:
'%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
。