如何进一步缩短将一个文件的内容复制到另一个文件的Python脚本?

时间:2012-07-21 16:55:31

标签: python

我正在阅读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建议他可以做的那样?

7 个答案:

答案 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()命令。