5

在完成这个练习时,我遇到了一个问题。

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

这条线# we could do these two on one line too, how?让我感到困惑。我能想到的唯一答案是:

indata = open(from_file).read()

这执行了我想要的方式,但它需要我删除:

input.close()

因为输入变量不再存在。那么,我该如何执行此关闭操作?

你会如何解决这个问题?

4

7 回答 7

14

在 python 中使用资源的首选方法是使用上下文管理器

 with open(infile) as fp:
    indata = fp.read()

with语句负责关闭资源和清理。

如果需要,您可以将其写在一行上:

 with open(infile) as fp: indata = fp.read()

但是,这在 python 中被认为是不好的样式。

您还可以在一个with块中打开多个文件:

with open(input, 'r') as infile, open(output, 'w') as outfile:
    # use infile, outfile

有趣的是,当我开始学习 python 时,我问了完全相同的问题。

于 2012-06-08T09:24:09.290 回答
2
with open(from_file, 'r') as f:
  indata = f.read()

# outputs True
print f.closed
于 2012-06-08T09:27:51.637 回答
2

您应该将此视为一种练习,以了解这input只是open返回的名称,而不是建议您应该以更短的方式进行操作。

正如其他答案所提到的,在这种特殊情况下,您正确识别的问题并不是什么大问题 - 您的脚本很快就会关闭,因此您打开的任何文件都会很快关闭。但情况并非总是如此,保证文件在完成后将关闭的常用方法是使用with语句 - 当您继续使用 Python 时,您会发现它。

于 2012-06-08T09:29:31.063 回答
0

当您的脚本完成时,该文件将自动安全地关闭。

于 2012-06-08T09:23:07.807 回答
0

以下 Python 代码将实现您的目标。

from contextlib import nested

with nested(open('input.txt', 'r'), open('output.txt', 'w')) as inp, out:
    indata = inp.read()
    ...
    out.write(out_data)
于 2012-06-08T09:33:06.697 回答
0

只需在现有代码行之间使用分号,即

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

我想他就是你所追求的..

于 2016-12-13T03:30:09.960 回答
0
in_file = open(from_file).read(); out_file = open(to_file,'w').write(in_file)
于 2018-08-17T09:52:07.000 回答