艰苦学习Python练习17额外问题(S)

时间:2010-08-24 21:41:51

标签: python python-2.x

我正在做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还写道,他可以在一行中完成整个剧本。我不确定他的意思是什么。

随意帮助我,无论你想要什么:通过给出答案或仅仅暗示 - 并且可能包括对问题的折叠或隐藏答案。

15 个答案:

答案 0 :(得分:19)

indata = open(from_file).read()

答案 1 :(得分:8)

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

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

import shutil, sys放在与此相同的行上(当然,中间有分号)但在风格上会很傻; - )。

答案 2 :(得分:6)

那么你可以做“代数替换”,对吧? ...假设你不关心“UI”...

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

答案 3 :(得分:3)

from sys import argv
open(argv[2], 'w').write(open(argv[1]).read())

答案 4 :(得分:1)

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

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

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

打印“文件%s复制到%s”%(from_file,to_file)

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

对于我来说,看到我在这里输入的相同的确切线并且在gedit中输入了自己,这有点怪异。伟大的东西,我真的很享受心理挑战和社区支持。

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

答案 5 :(得分:1)

尝试以下代码:

import shutil, sys; shutil.copy(sys.argv[0], sys.argv[2])

答案 6 :(得分:1)

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

可以写成

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

答案 7 :(得分:0)

他在“普通学生问题”一节中回答了以下问题:

  

你决不能这一行!

     那是;要看 ;上 ;怎么样 ;你定义一个;线的代码。

答案 8 :(得分:0)

Hey Kiwi(以及其他任何人发现这个!),

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

Shaw的两篇可能的读物是“我可以让这一行更长”的戏弄。

  1. 在从模块中导入所有必要的命令后,他可以使Python脚本长一行,例如from sys import argv等。
  2. 他可以使用命令行将一个文件的内容复制到另一行中。
  3. 我个人认为他的意思是后者,但我会为了学习而解释这两种解决方案!

    第一个(长期)解决方案: 您必须确认在Python文件中需要import x from y行,否则argvexist将无效,因为它们只会被隐式引用,即你没有向Python明确表示你想要使用这些功能。

    接下来要做的是删除所有不相关的代码,使用为用户的利益而编写的无关代码,即printraw_input()len()等。< / p>

    如果你这样做,你将留下:

    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()))
    

    然后,您可以使用大量;来链接所有代码行,并且您已经完成了违规行为。

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

    第二个(简短)解决方案:

    如果你看看他的“你应该看到什么”部分,他会在终端使用猫。这是连接的缩写,这是将字符串连接在一起的一种方法。如果你将它与&gt;结合使用你可以用一行代码覆盖一个文件的内容:

    cat from_file.txt > to_file.txt
    

    就是这样。一行将获取一个文件的内容并将其放入另一个文件中。

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

    反馈意见,我两天前才开始这样做......

答案 9 :(得分:0)

切掉你不需要的一切,Zed所说的所有'你不需要的功能',你得到一条线。它的长度甚至不到80个字符,不能比那更加“pythonic”!

来自sys import argv; s,f,t = argv; (open(t,'w')。write(open(f).read()))

答案 10 :(得分:0)

他所说的只是你可以用分号将两行放在一行上然后运行

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

如果你想

,你可以使用整段代码

答案 11 :(得分:0)

我也在网上做同一本书。我尝试了这个,它起作用了:

{{1}}

换句话说,我在写入模式下打开了我正在复制的文件,然后在打开和读取之后将我正在复制的文件的内容插入到写入功能中。我检查了我的文件,但它确实有效。耶!

答案 12 :(得分:0)

对这个有一点乐趣。在回答这个问题时,我一直在寻找一种保留功能的解决方案,使用了练习所涉及的文件命令而没有使用&#34 ;;&#34;结合线条。我能来的最近的是

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

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

答案 13 :(得分:0)

以下一行对我有用:

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

答案 14 :(得分: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()