我真的需要关闭文件吗?如果是这样,为什么以及如何?

时间:2014-05-30 14:46:00

标签: python

代码取自“学习Python艰难之路”练习17,但我稍微调整了一下,所以我问这个问题:


from sys import argv
from os.path import exists

script, file1, file2 = argv

print "Copying from %s to %s:" % (file1, file2)

indata = open(file1).read()

print "The input file is %d bytes long" % len(indata)

print "Does the output file exist? %r" % exists(file2)

outdata = open(file2, 'w').write(indata)

当我添加这些行时:

file1.close()
file2.close()

在此代码的末尾。我在终端上得到了输出:

从python / test.txt复制到python / sampleout.txt:

The input file is 18 bytes long
Does the output file exist? True
Traceback (most recent call last):
  File "python/myprogram0.py", line 16, in <module>
    file1.close()
AttributeError: 'str' object has no attribute 'close'

没有这两行,代码工作正常。但我还以为我会问。

那我在这里做错了什么?那最后一点是什么意思?

4 个答案:

答案 0 :(得分:8)

您没有关闭文件,而是尝试“关闭”文件名,这是一个字符串。您需要做的是将open(...)的返回值保存在变量中,并在其上调用close

infile = open(file1)
indata = infile.read()
infile.close()

在现代代码中,最好使用close语句,而不是显式调用with;当退出with语句时,无论是因为代码运行完成,还是因为抛出异常,文件都会自动关闭:

from sys import argv
from os.path import exists

script, input_file_name, output_file_name = argv

print("Copying from {} to {}:".format(input_file_name, output_file_name))

with open(input_file_name) as input_file:
    data = input_file.read()

print("The input file is {} bytes long".format(len(data)))
print("Does the output file exist? {}".format(exists(output_file_name)))

with open(output_file_name, 'w') as output_file:
    output_file.write(data)

答案 1 :(得分:1)

你需要这样做:

  indata = open(file1)
  mystring = indata.read()
  indata.close()

答案 2 :(得分:0)

在你的情况下,

file1和file2是字符串,关闭文件使用文件描述符:

indata.close()
outdata.close()

重温Python中的文件操作:https://docs.python.org/2/tutorial/inputoutput.html 通常,一旦tit的filedescriptor超出范围,Python就会隐式关闭文件。请阅读有关Python变量范围的this

答案 3 :(得分:0)

这是因为 file1 file2 变量是字符串而不是文件描述符,首先将文件描述符存储在变量中,然后在使用它后将其关闭。

f1 = open(file1)
# Read the contents of the file
f1.close()

同样适用于 file2 变量。您应该使用 with 语句,因为文件在with块后自动关闭。

with open(file1) as f1:  # The file1 is open
    indata = f1.read()
    with open(file2) as f2:  # The file2 is open
        # The file1 and file2 will be automatically closed after the next line
        f2.write(indata)

当你打开一个文件时,你会得到一个文件描述符,它基本上是内核所持有的结构中的一个索引,它存储了所有打开文件的引用,所以当你完成使用该文件时你需要关闭它删除它那个参考。要处理使用文件描述符来访问文件,进程必须通过系统调用将文件描述符传递给内核,内核将代表进程访问文件。