这个.write命令有什么问题?

3
我使用了Learnpythonthehardway.org,在第16个练习中的学习任务说: “使用字符串、格式和转义字符,用一个 target.write() 命令而不是六个命令来打印出 line1、line2 和 line3。”
于是,我进行了改变:
target.write(line1, "\n", line2, "\n" line3, "\n")
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")

Into:

target.write("%s \n  %s \n %s \n") %(line1, line2, line3) 

可以有人解释一下我做错了什么吗?
3个回答

3

file.write()只接受一个参数,不支持多个参数。只有print()函数可以处理多个参数。

你需要将字符串格式化为一个参数,而不是尝试“格式化”target.write()函数的返回值:

target.write("%s\n%s\n%s\n" % (line1, line2, line3))

或者使用print()函数添加换行符和分隔符:
print(line1, line2, line3, sep='\n', file=target)

print() 作为函数是 Python 3 的默认设置;如果您使用的是 Python 2,则可以通过添加以下内容将语句 print 转换为函数 print():

from __future__ import print_function

在您的模块开始时。

请注意,原始练习代码将行写入文件中间没有空格。


那么,file = target 的意思是这行代码将会被写入到名为 target 的文件中,对吗?如果是这样,那么这段代码是否会像其他的 print 命令一样在终端中显示出来呢?另外,我不应该说“谢谢”吗?因为我很新,而且帮助文档上是这么说的。 - Kachachan
@user2999145:不会,在终端中不会显示这些行。默认的file参数是sys.stdout,基本上就是终端。通过指定file=target,你告诉print()在别处“打印”(写入)数据。 - Martijn Pieters
@user2999145:我们尽量让问题简明扼要,方便未来的访问者。我和其他人一样欣赏“谢谢”,但最好留在评论中,而不是问题本身。 - Martijn Pieters
不,我的意思是在注释部分,它说不要说“谢谢”。 - Kachachan
是的,仅仅说“谢谢”也会在评论中增加混乱。对于那些“谢谢,这个帮助了我”的回复,我们有投票和标记答案为已接受的选项。:-) - Martijn Pieters
我该怎么做?非常抱歉,但似乎找不到相应的按钮。 编辑:我的意思是将答案标记为已接受。 - Kachachan

3
你需要这样做:

你必须按照这样的方式进行


target.write("%s \n  %s \n %s \n" % (line1, line2, line3))

最好使用字符串的format方法。
target.write("{} \n  {} \n {} \n".format(line1, line2, line3))

编辑:

如果想了解为什么使用format比使用%更好,请参考此问题


@Levon 我们已经有一个相关问题了 https://dev59.com/p2445IYBdhLWcg3wBVrz - thefourtheye
是的,我知道这一点,但这是为了帮助提问者并使你的回答更完整。如果你声称某个东西比另一个更好,解释一下为什么似乎是合理的(我并不反对,但考虑到提问者的问题,他们可能会从更完整的答案中受益)。 - Levon
@Levon 我可以直接包含那个问题的链接吗? - thefourtheye
当然,那也可以达到同样的目的(并且给OP一个找出为什么这是更好的方法的方式 :) .. 这样任何看到这个答案的人都有了他们需要的所有信息,而不必寻找原因。 - Levon
1
@Levon 很好,我刚刚添加了对那个问题的引用 :) - thefourtheye

0

在字符串上应用%运算符。

target.write("%s \n  %s \n %s \n" % (line1, line2, line3))

注意:对于更复杂的字符串格式化,请在字符串上使用format方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接