21

我正在做 Zed Shaw 的精彩Learn Python The Hard Way,但还有一个问题让我很困惑:第 9--10 行可以写成一行,怎么写?我尝试了一些不同的想法,但无济于事。我可以继续前进,但那有什么乐趣呢?

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."

Zed 还写道,他可以在一行中完成整个脚本。我不完全确定他的意思。

随心所欲地帮助我:给出答案或仅仅暗示——也许包括对问题的折叠或隐藏的答案。

4

15 回答 15

21
indata = open(from_file).read()
于 2010-08-24T21:44:45.710 回答
8

shutil是在 Python 中进行单行文件复制的方法:

shutil.copy(sys.argv[1], sys.argv[2])

然而,把它import shutil, sys和这个放在同一行(当然,中间有一个分号)在风格上会很愚蠢;-)。

于 2010-08-24T22:09:52.523 回答
6

那么你可以做“代数替换”,对吗?...假设您不关心“用户界面”...

open(to_file, 'w').write(open(from_file).read())
于 2010-08-24T22:14:12.967 回答
3
from sys import argv
open(argv[2], 'w').write(open(argv[1]).read())
于 2011-09-27T00:42:57.740 回答
1

试试下面的代码:

import shutil, sys; shutil.copy(sys.argv[0], sys.argv[2])
于 2011-01-22T17:16:59.473 回答
1
output = open(to_file, 'w')
output.write(indata) 

可以写成

open(to_file, 'w').write(indata)
于 2014-06-19T03:02:36.243 回答
1

他在下面的“学生常见问题”部分回答了这个问题:

你不可能做到这一点!

那 ; 要看 ; 上 ; 如何 ; 你 ; 定义 ; 一 ; 线 ; 的 ; 代码。

于 2013-01-24T00:08:43.513 回答
1

我同意@dash-tom-bang 提到的代数替换。我的有效练习 17 额外学分有 5 行。该操作正在一条线上进行。

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

然后是一个简单的“打印”验证反馈

print "文件 %s 复制到 %s" % (from_file, to_file)

我应该有第 6 行来替换原来的 ''output.close'' 但我很困惑如何在没有 ''output'' 变量的情况下做到这一点?啊,因为我现在没有输出变量,所以没有什么可以关闭的。

顺便说一句 - 看到我在这里输入的完全相同的行,我已经制定并在 gedit 中输入了自己,这让我有点毛骨悚然。很棒的东西,我真的很享受精神挑战和社区支持。

编辑:回答了我自己的问题

于 2010-10-31T13:14:38.753 回答
1

玩了这个。在回答这个问题时,我正在寻找一种保留功能的解决方案,使用练习所涉及的文件命令并且不使用“;” 组合线条。我能来的最近的是

open(input("Out?: "), 'w').write(open(input("In?: ")).read())

与提示输入而不是使用命令行的功能不完全相同。但是在练习中使用文件命令并避免使用分号连接行时完成工作的单行。

于 2017-10-14T03:40:02.443 回答
0

嘿猕猴桃(以及其他人发现这个!),

我正在进行同样的练习,我相信我已经破解了它。

对 Shaw 的“我可以把这一行加长”的戏弄有两种可能的解读。

  1. 在从模块导入所有必要的命令后,他可以使 Python 脚本长一行,例如from sys import argv,等。
  2. 他可以使用命令行在一行中将一个文件的内容复制到另一个文件中。

我个人认为他的意思是后者,但为了学习,我将解释这两种解决方案!

第一个(长)解决方案: 您必须承认您需要 Python 文件中的importx fromy 行,否则argvexist无法工作,因为它们只会被隐式引用,即您没有向 Python 明确您想要使用这些功能。

接下来要做的是删除所有不相关的代码,不相关的是为用户利益而编写的代码,即print, raw_input(),len()等。

如果你这样做,你将得到:

from sys import argv
from os.path import exists

script, from_file, to_file = argv

indata = open(from_file).read()

out_file = open(to_file, 'w')
out_file.write(indata)

out_file.close()
in_file.close() 

为了使这更短,您可以开始将变量和函数相互嵌套。这与数学中的原理相同,您可以定义一个函数,然后将表示该函数的变量替换为另一个函数。

例如:

y = x + 3
z = y, which is essentially z = (x + 3)

如果你解决了这个问题,你可以将代码简化为:

from sys import argv
from os.path import exists

script, from_file, to_file = argv

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

然后,您可以使用很多;来链接所有代码行,并且您已经完成了 vio-la。

注意:您不需要像在原始文件中那样关闭文件,因为 Python 会在执行脚本时自动关闭它们。

第二个(短)解决方案:

如果您查看他的“您应该看到的内容”部分,他会在终端中使用 cat 。这是连接的缩写,它是将字符串连接在一起的一种方式。如果将其与 > 结合使用,则可以在一行中用另一个文件覆盖一个文件的内容:

cat from_file.txt > to_file.txt

而已。一行将获取一个文件的内容并将其放入另一个文件。

当然,这两种解决方案都不完美,因为第一个不是真正的一行,第二个甚至不使用 Python!

感谢反馈,我两天前才开始这样做......

于 2014-10-29T13:19:02.373 回答
0

去掉所有你不需要的东西,就像 Zed 所说的那样,所有“你不需要的功能”,你就得到了一条线。它的长度甚至不到 80 个字符,没有比这更“pythonic”的了!

从系统导入 argv;s, f, t = argv; (open(t, 'w').write(open(f).read()))

于 2015-11-19T01:25:21.507 回答
0

我也在网上做同样的书。我试过这个,它奏效了:

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

换句话说,我以写入模式打开了要复制到的文件,然后在打开并读取文件后将要复制的文件的内容插入到写入函数中。我检查了我的文件并且它有效。耶!

于 2016-11-25T22:53:55.200 回答
0

以下行对我有用:

open(to_file, 'w').write(open(from_file).read())
于 2019-06-11T16:38:24.387 回答
0

他只是说你可以使用分号将两行放在一行上并让它运行

in_file = open(from_file);  indata = in_file.read()

如果你愿意,你可以用整段代码来做到这一点

于 2016-03-17T19:27:13.813 回答
0

常见学生问题部分有一个提示:

“你不可能做到这一行!那;取决于;取决于;如何;你;定义;一个;行;的;代码。”

注意:这显然不是最佳实践并且难以阅读。

from sys import argv
script, from_file, to_file = argv
in_file = open(from_file); indata = in_file.read(); out_file = open(to_file, 'w'); out_file.write(indata); out_file.close(); in_file.close()
于 2020-12-11T18:38:34.093 回答