如何在一行中写入多个字符串?

19

我开始学习Python,使用的是LPTHW,并且已经进行到了第16个练习:

http://learnpythonthehardway.org/book/ex16.html

但是我感觉自己像个傻瓜,因为我无法弄清楚一个看似简单的“额外任务”,它要求如下:

target.write(line1)
target.write('\n')
target.write(line2)
target.write('\n') 
target.write(line3)
target.write('\n') 
将其压缩为一行代码。我尝试了以下方法:
target.write(line1 \n, line2 \n, line3 \n)

或者:

target.write('line1 \n, line2 \n, line3 \n')

或者:

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

我只是无法将line1、line2和line3字符串都在同一行中重写。我尝试了各种其他组合,包括逗号、引号等,但仍然出现各种错误,例如语法无效或参数过多。

12个回答

51
target.write(line1 \n, line2 \n, line3 \n)

'\n'只在字符串字面量内才有意义。没有引号,你就没有字符串字面量。

target.write('line1 \n, line2 \n, line3 \n')

好的,现在所有东西都是字符串字面量了。但你希望line1、line2、line3不是字符串字面量。你需要将它们作为Python表达式来引用相关变量。基本上,你必须在实际是文本的字符串(如"\n")周围放置引号,而不是在变量周围放置引号。如果你这样做,你可能会得到像下面这样的结果:

target.write(line1 '\n' line2 '\n' line3 '\n')

2 2是什么?它什么都不是。你需要告诉Python如何组合这两个部分。因此,你可以使用2 + 22 * 2,但2 2没有意义。在这种情况下,我们使用add来组合两个字符串。

target.write(line + '\n' + line2 + '\n' + line3 + '\n')

接下来,

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

再次强调,\n 只在字符串中有意义。当使用 % 运算符生成字符串时,它的左侧需要是一个字符串。因此,您需要将所有格式化细节放在一个字符串中。

target.write('%r \n', '%r \n', '%r \n') % (line1, line2, line3)

但这会生成 3 个字符串字面量,而您只想要一个。如果您这样做了,会写出抱怨,因为它只接受一个字符串,而不是 3 个。所以您可能尝试了类似以下的方式:

target.write('%r \n%r \n%r \n') % (line1, line2, line3)

但是你想把line1、line2和line3写入文件。在这种情况下,你尝试在写入完成后进行格式化操作。当Python执行此操作时,它将首先运行target.write,因此留下:

None % (line1, line2, line3)

这将不会产生有用的结果。为了修复这个问题,我们需要把%()放在.write()里面。

target.write('%r\n%r\n%r\n' % (line1, line2, line3))

1
谢谢你提供如此全面的答案/解释。我不仅明白了正确答案,还知道了错误答案以及这里发生的事情。非常感谢! - jstacks
@jstacks,那么我的任务在这里完成了! - Winston Ewert

7
你的最后一次尝试看起来很有希望。它应该像这样:
"%s \n %s \n %s" % (line1, line2, line3)

这将运用操作符%到一个字符串(带有3个%s占位符)和一个需要替换的元组值(在这里是字符串)。结果是格式化后的字符串。

因此,您需要将其包装在接受结果的函数中:

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

我真的不知道是给你还是给'+'答案打勾。然而,我从来没有想过使用'+',但这是一个很好的学习教训。这里的括号是另一个,我很感激。当使用这种方法时,它似乎会把引号扔回给我...我该如何解决这个问题?因为删除它们会导致语法错误。 - jstacks
@jstacks,如果你需要关于语法错误的帮助,请始终向我们展示代码和语法错误。 - Winston Ewert
引号是因为我一直在使用%r,使用%s修复了这个问题...但是为什么?我知道's'表示它将专门针对字符串。但'r'不是更广泛地工作,仍然会返回一个字符串吗?为什么它不能起到相同的作用?另外,当使用这种方法时,line2和line3略微缩进。这是为什么,应该如何解决? - jstacks
1
@jstacks,5r使用repr()会添加引号,%s使用str()不会。它们都将任何内容转换为字符串,但规则不同。由于字符串周围的空格,您多了额外的缩进。 - Winston Ewert

4
这是一种方法:
target.write(line1 + '\n' + line2 + '\n' + line3 + '\n')

以下内容无法正常工作的原因是:
target.write(line1 \n, line2 \n, line3 \n)

这里的line1是一个变量(注意没有引号),而'\n'是一个字符串(因为它在引号内)。加法运算符对字符串进行重载,可以将它们连接(组合)起来。

这个不起作用的原因是:

target.write('line1 \n, line2 \n, line3 \n')

因为line1是一个变量,当你将它放在引号中时,它不再被视为变量。

我已经尝试过(line1'\n',line2'\n',line3'\n'),但这也不起作用(也尝试在每个元素之间加逗号)。为什么使用+可以工作,而逗号则不行?我猜测它把逗号之间的每个元素都视为自己的参数,而不只是一个带有单独变量的参数?所以,+号就能解决这个问题吗? - jstacks
@jstacks 方法调用中的逗号是参数的分隔符,因此当只期望一个参数时,它会将其视为单独的参数。在 Python 中,空格只是无意义的,因此会出现错误。+ 在操作顺序中比函数评估具有更高的优先级,并且如上所述,字符串加号表示连接。例如,print "hello"+"world"print "helloworld" 完全相同。或者对于数字,print 1+1print 2 相同,因为加法发生在打印之前。 - Davy8
谢谢你和温斯顿发布的内容,我学到了很多。Stackoverflow太棒了。 - jstacks

2

以下代码对我有效:

 target.write(line1 + line + line2 + line + line3 + line)

在此之前,我添加了
 line = '\n'

我的代码如下:

 from sys import argv
 script, filename = argv
 print 'Appending process starts on: %r' % filename
 target = open(filename, 'a')
 print 'Enter the contents:\t'
 line1 = raw_input('Next:\t')
 line2 = raw_input('Next:\t')
 line3 = raw_input('Next:\t')
 line = '\n'
 target.write(line1 + line + line2 + line + line3 + line)
 print 'Thank you !'

2

作者建议使用格式化、字符串和转义字符,以便以下代码正常工作。这实现了Python的f-strings:

最初的回答建议使用格式、字符串和转义字符,以使下面的代码正常工作。这将实现Python的f-strings:

target.write(f"{line1} \n{line2} \n{line3} \n")

0
不要试图过度复杂化它。字符串的工作方式与打印内容时相同,只是您从target.write开始,这样您就可以将其写入文件而不是打印。
例如,如果您要打印变量并将它们放在每个新行上,则会使用此字符串 print(f"{line1} \n{line2} \n{line3} \n")
在练习5中,您学习到要拉取变量,您需要在变量名称周围放置{},如果您想将变量放入字符串中,则必须以f"开头 在练习9中,您学习了如果要换行,则必须使用\n
现在您想将其写入文件而不是打印它,因此字符串相同,只是这次以target.write开头 target.write(f"{line1} \n{line2} \n{line3} \n")

0

这对我有用。

target.write("line1\nline2\nline3\n")

而且,让我感兴趣的关键字是由Ewart提到的,"'\n'只在字符串文字中有意义。"


0

这些信息真的很有帮助。我通过以下方式得到了正确的结果:

target.write(line1 + "\n" + line2 + "\n" + line3 + "\n")

连接字符串的想法从未出现在我的脑海中。


0

target.write(line1 + ' ' + line2 + ' ' + line3 + ' ')

如果你想要在同一行上,上面的代码就可以了。如果你想要分开显示,需要加上"\n"表示新的一行。


0
这很简单:
with open('file.txt','w') as file:

    file.write('a: {}, b: {}  '.format(a,b))

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