1

我正在学习 Zed Shaw 的“Learn Python The Hard Way”。我要练习 16 ( http://learnpythonthehardway.org/book/ex16.html ) 并且遇到了一个问题来找出额外的信用 #3。在底部有一系列 6 个 target.write 命令script 和 Zed 希望我使用字符串、格式和转义符将它们简化为单个 target.write 命令。

这是带有 6 个 target.write 命令的原始脚本...

from sys import argv

script, filename = argv

print "We're going to erase %r." % filename
print "If you don't want that, hit CTRL-C (^C)."
print "If you do want that, hit RETURN."

raw_input("?")

print "Opening the file..."
target = open(filename, 'w')

print "Truncating the file.  Goodbye!"
target.truncate()

print "Now I'm going to ask you for three lines."

line1 = raw_input("line 1: ")
line2 = raw_input("line 2: ")
line3 = raw_input("line 3: ")

print "I'm going to write these to the file."

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

print "And finally, we close it."
target.close()

首先,我尝试像这样压缩 target.write 命令......

target.write (line1, line2, line3)

当我运行脚本时,我得到了;TypeError:函数只需要 1 个参数(给定 3 个)

然后我试了...

target.write "I love %r and %r and %r." % (line1, line2, line3)

我得到 SyntaxError: invalid syntax

我也试过...

target.write (line1), (line2), (line3)

这次脚本运行到竞争没有任何错误,但是当我打开脚本应该写入的文件(text.txt)时,它只将第一个字符串(line1)写入文件,而不是其他两个字符串(第 2 行)和(第 3 行)。

最后,我尝试了这个...

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

但是我又得到了一个 SyntaxError: invalid syntax

有人可以指出我正确的方向吗?

非常感激。

埃迪

4

10 回答 10

3

你可以做

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

或者,也许写得更清楚一点:

lines=(line1,line2,line3)
target.write( '\n'.join(lines) + '\n')

虽然在这种情况下,我实际上可能会单独编写最后一个换行符,以避免创建一个全新的字符串只是为了在末尾添加一个换行符(而且我认为它看起来更干净):

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

这需要你的行,将它们打包成一个元组,并使用join字符串对象的方法将它们变成一个被写入的字符串。

这种方法的优点(与字符串格式相反)是您不需要先验地知道要编写多少“行”。任何可迭代对象都可以代替上述表达式中的元组。

于 2012-07-20T17:35:05.897 回答
2

write()需要一个string作为参数。你可以试试

 target.write (line1 + '\n' + line2 +'\n' + line3)  # ugly!! - but works

更好的方法是构建你的字符串然后打印它。

 line = '{}\n{}\n{}\n'.format(line1, line2, line3)
 target.write(line)

或动态加入你的字符串join(),以及其他几种方法来解决这个问题,但这应该让你开始(并解释问题的原因)。

于 2012-07-20T17:34:24.570 回答
2

一般而言,任何由定义的数据序列重复相同操作组成的代码都可以转换为循环,该循环遍历该数据的集合,并在循环中执行该操作。因此,这:

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

变成:

data = (line1, "\n", line2, "\n", line3, "\n")
for datum in data:
    target.write(datum)

好多了!write现在,如果您想做其他事情(例如发送到不同的文件,或使用不同的方法),您只需更改一行代码。看看你能不能想出办法让这一切变得更好

但是,还有另一种选择:如果您对多个数据进行操作,该操作具有连接该数据的效果,您可以将数据连接到单个数据中并执行一次操作(绝对新手:请注意,如果操作执行更多操作除此之外,它们可能并不完全等价)。在这种情况下,它变成:

data = (line1, "\n", line2, "\n", line3, "\n")
target.write(''.join(data))

现在,查看 的文档join,并找出如何进一步简化它。(提示:它利用了与简化循环相同的数据事实)。

于 2012-07-20T18:04:50.037 回答
1

怎么样

target.write("%s\n%s\n%s\n" % (line1, line2, line3))
于 2012-07-20T17:36:09.100 回答
1

写一个字符串:

行 = "%s\n%s\n%s\n" % (line1, line2, line3)

target.write(行)

于 2014-03-03T05:40:14.310 回答
0

我做了

target.write("%s\n%s\n%s" % (line1, line2, line3 ))
于 2013-08-24T23:21:06.880 回答
0
target.write('\n' .join((line1 , line2 , line3))+'\n')
于 2014-07-04T20:40:09.073 回答
0

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

于 2015-02-06T03:46:16.397 回答
0
target.write(""" #{line1} \n #{line2} \n #{line3} \n""")

这是唯一对我有用的。

于 2016-10-26T10:55:00.130 回答
0

这对我有用,试试看

lines = " %s \n %s \n %s  \n"  %  (line1, line2, line3)

target.write(lines)
于 2017-11-02T15:20:44.313 回答