我正在通过Zed Shaw的“学习Python艰难之路”。我要练习16(http://learnpythonthehardway.org/book/ex16.html)并遇到一个问题,想出额外的功劳#3。脚本底部有一系列6个target.write命令,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:function只需要1个参数(给定3个)
然后我试了......
target.write "I love %r and %r and %r." % (line1, line2, line3)
我得到SyntaxError:语法无效
我也试过......
target.write (line1), (line2), (line3)
这次脚本运行到竞争没有任何错误,但是当我打开脚本应该写入的文件(text.txt)时,它只将第一个字符串(line1)写入文件,而不是另一个两个字符串(第2行)和(第3行)。
最后,我试过了......
target.write (line1, "\n", line2 "\n", line3, "\n")
但我又得到了一个SyntaxError:语法无效
有人能指出我正确的方向吗?
非常感谢。
埃迪
答案 0 :(得分:4)
你可以做到
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
方法将它们组合成一个写入的字符串。
这种方法的优势(与字符串格式化相反)是你不需要知道 a-priori 你要编写多少“行”。任何可迭代对象都可以代替上面表达式中的元组。
答案 1 :(得分: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()
动态加入你的字符串,以及其他几种方法来解决这个问题,但这应该让你开始(并解释问题的原因)。
答案 2 :(得分:2)
怎么样
target.write("%s\n%s\n%s\n" % (line1, line2, line3))
答案 3 :(得分: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
代码。 看看你是否能找到更好的方法。
但是,还有另一种选择:你可以对多个数据进行操作,这些数据具有连接数据的效果,你可以将数据连接成一个数据并执行一次操作(绝对新手:< / em>请注意,如果操作不止于此,它们可能不完全等效)。在这种情况下,它变为:
data = (line1, "\n", line2, "\n", line3, "\n")
target.write(''.join(data))
现在,查看join
的文档,并弄清楚如何进一步简化。(提示:它利用了与简化循环的数据相同的事实一样)。
答案 4 :(得分:1)
写一个字符串:
lines =“%s \ n%s \ n%s \ n”%(line1,line2,line3)
target.write(线)
答案 5 :(得分:0)
我做了
target.write("%s\n%s\n%s" % (line1, line2, line3 ))
答案 6 :(得分:0)
target.write('\n' .join((line1 , line2 , line3))+'\n')
答案 7 :(得分:0)
target.write(“”“line1 \ n line2 \ n line3 \ n”“”)
答案 8 :(得分:0)
target.write(""" #{line1} \n #{line2} \n #{line3} \n""")
这是唯一对我有用的人。
答案 9 :(得分:0)
这对我有用,试一试
lines = " %s \n %s \n %s \n" % (line1, line2, line3)
target.write(lines)