代码取自“学习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'
没有这两行,代码工作正常。但我还以为我会问。
那我在这里做错了什么?那最后一点是什么意思?
答案 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)
当你打开一个文件时,你会得到一个文件描述符,它基本上是内核所持有的结构中的一个索引,它存储了所有打开文件的引用,所以当你完成使用该文件时你需要关闭它删除它那个参考。要处理使用文件描述符来访问文件,进程必须通过系统调用将文件描述符传递给内核,内核将代表进程访问文件。