我正在阅读Zed Shaw的“学习Python艰难之路”。我打算练习17(http://learnpythonthehardway.org/book/ex17.html),并在额外学分#2& 3. Zed希望我通过删除任何不必要的东西来缩短脚本(他声称他可以在脚本中只用一行来运行它)。
这是原始剧本......
from sys import argv
from os.path import exists
script, from_file, to_file = argv
print "Copying from %s to %s" % (from_file, to_file)
# we could do these two on one line too, how?
input = open(from_file)
indata = input.read()
print "The input file is %d bytes long" % len(indata)
print "Does the output file exist? %r" % exists(to_file)
print "Ready, hit RETURN to continue, CTRL-C to abort."
raw_input()
output = open(to_file, 'w')
output.write(indata)
print "Alright, all done."
output.close()
input.close()
以下是我能够将脚本缩短并仍能使其正常运行(正确地说,我的意思是脚本成功地将预期文本复制到目标文件中)...
from sys import argv
from os.path import exists
script, from_file, to_file = argv
input = open (from_file)
indata = input.read ()
output = open (to_file, 'w')
output.write (indata)
我摆脱了打印命令和两个关闭的命令(请原谅我是否正确地使用“命令”...我对编码感到痛苦,并且还没有得到行话)。
我尝试进一步缩短脚本的其他任何内容都会产生错误。例如,我试图将“input”和“indata”命令组合成一行,如此......
input = open (from_file, 'r')
然后我将脚本中的任何“indata”引用更改为“input”...
from sys import argv
from os.path import exists
script, from_file, to_file = argv
input = open (from_file, 'r')
output = open (to_file, 'w')
output.write (input)
但我得到以下TypeError ......
new-host:python Eddie$ python ex17.py text.txt copied.txt
Traceback (most recent call last):
File "ex17.py", line 10, in <module>
output.write (input)
TypeError: expected a character buffer object
你会如何进一步缩短脚本......或者将其缩短到一行,就像Zed建议他可以做的那样?
答案 0 :(得分:4)
您可以使用shutil
库,让操作系统承担副本的负担(而不是在Python中读取/写入数据)。
import shutil
shutil.copy('from_file', 'to_file_or_directory_name')
答案 1 :(得分:3)
您获得的当前错误是由于:
input = open (from_file, 'r')
output.write (input)
write()想要一个字符串作为参数,你给它一个文件对象。
此外,由于您试图消除多余的内容/缩短您的代码,小项目,opening文件的默认模式为'r'
ead,因此在打开时不必指定阅读文件。
另请考虑使用with
构造来打开和管理您的文件。优点是文件将在您完成后自动关闭,或者遇到异常,因此不需要显式close()
。如,
with open('data.txt') as input:
## all of your file ops here
PEP08 -- Style Guide for Python(Python必须阅读)程序员建议不要在函数和开头(
之间留出空格。
我不确定单行的目标是否会产生更好或更易读的解决方案,因此应该牢记这一点。
答案 2 :(得分:3)
from sys import argv
open(argv[2], 'w').write(open(argv[1]).read())
就像你能做到的一样短。您可以使用分号将它们连接成一行,但这只是用其他内容替换行尾字符而不是真正有用。
答案 3 :(得分:0)
不确定这是否是作者所寻求的,但这是我在经过多次试错之后提出的解决方案。我自己是初学者所以请记住这一点。 这是脚本:
from sys import argv; script, from_file, to_file = argv
in_file = open(from_file).read(); out_file = open(to_file, 'w').write(in_file)
答案 4 :(得分:0)
我完全采用了“一行”指令并完全省略了导入行。 我发现它也更友好了:
open(raw_input("To file? "), "w").write(open(raw_input("From file? ")).read())
仍然没有关闭'To file',但是,嘿,一行!
- EDIT-- 我刚注意到,当脚本完成时,Python 会关闭“To file”。 所以,是的,一行!
答案 5 :(得分:0)
以下怎么样?以为这会做。
open(input(),'w').write(open(input()).read())
答案 6 :(得分:0)
这是我提出的(也是初学者):
from sys import argv
script, from_file, to_file = argv
open(to_file, 'w').write(from_file)
它有效,但我不确定我是否打开了任何文件。我想我可能还需要close()命令。