0

我正在阅读 Zed Shaw 的“Learn Python The Hard Way”。我要练习 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)

但我得到以下类型错误...

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 建议的那样?

4

7 回答 7

4

您可以只使用该shutil库并让操作系统承担副本的负担(而不是在 Python 中读取/写入数据)。

import shutil
shutil.copy('from_file', 'to_file_or_directory_name')
于 2012-07-21T17:21:08.843 回答
3

您得到的当前错误是由于以下原因:

input = open (from_file, 'r')

output.write (input)

write()想要一个字符串作为参数,你给它一个文件对象。

此外,由于您试图消除多余的东西/缩短您的代码,小项目,打开文件的默认模式ead 'r',打开文件进行读取时不必指定。

还可以考虑使用该with构造来打开和管理您的文件。优点是当你完成或遇到异常时,文件会自动为你关闭,所以不需要显式close()。例如,

with open('data.txt') as input:
   ## all of your file ops here

PEP08 ——Python 风格指南(Python 程序员的“必读”)建议不要在函数和开头之间留空格(

我不确定单行的目标是否总是会产生更好或更易读的解决方案,因此应牢记这一点。

于 2012-07-21T17:00:28.157 回答
3
from sys import argv
open(argv[2], 'w').write(open(argv[1]).read())

是尽可能短的。您可以使用分号将它们连接成一行,但这只是用其他字符替换行尾字符,并没有真正有用。

于 2012-07-21T17:05:43.803 回答
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)
于 2014-09-24T11:27:39.200 回答
0

我从字面上理解了“in one line”指令,并完全省略了导入行。我也觉得它更友好:

open(raw_input("To file? "), "w").write(open(raw_input("From file? ")).read())

仍然没有关闭“到文件”,但是,嘿,一行!

--EDIT-- 我刚刚注意到,当脚本完成时,Python确实关闭了“To file”。所以,是的,一条线!

于 2014-10-09T12:19:05.683 回答
0

下面的呢?以为这样就行了。

open(input(),'w').write(open(input()).read())
于 2015-03-30T08:12:59.177 回答
0

这就是我想出的(也是初学者):

    from sys import argv

    script, from_file, to_file = argv

    open(to_file, 'w').write(from_file)

它有效,但我不确定我是否打开了任何文件。我想我可能仍然需要 close() 命令。

于 2016-12-15T18:54:08.537 回答