如何简化这一系列的target.write命令?

时间:2012-07-20 17:32:39

标签: python

我正在通过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:语法无效

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

非常感谢。

埃迪

10 个答案:

答案 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)