我有一个Python脚本,我打开两个文件进行阅读,当我试图关闭它们时,它会抛出 AttributeError:'list'对象没有属性'close' 错误。
我的剧本摘录如下:
firstFile = open(jobname, 'r').readlines()
secondFile = open(filename, 'r').readlines()
{
bunch of logic
}
firstFile.close()
secondFile.close()
答案 0 :(得分:9)
firstFile
和secondFile
不代表实际文件,它们是行列表。要解决此问题,请保存文件句柄。
firstFile = open(jobname, 'r')
firstFileData = firstFile.readlines()
secondFile = open(filename, 'r')
secondFileData = secondFile.readlines()
# bunch of logic ...
firstFile.close()
secondFile.close()
或者,您可以使用with
构造:
with open(jobname, 'r'), open(filename, 'r') as firstFile, secondFile:
firstFileData = firstFile.readlines()
secondFileData = secondFile.readlines()
# bunch of logic...
答案 1 :(得分:5)
.readlines()
返回一个列表。你真的想做这样的事情:
with open(jobname) as first, open(filename) as second:
first_lines = first.readlines()
second_lines = second.readlines()
with
块会自动关闭并清理文件句柄。
此外,您可能实际上并不需要读取行,除非您确实希望将该文件的全部内容放在内存中。您可以直接遍历文件本身:
for line in first:
#do stuff with line
或者如果长度相同:
for line_one, line_two in zip(first, second):
# do things with line_one and line_two
答案 2 :(得分:3)
虽然其他情况正确,但您也可以使用自动资源管理:
with open(jobname, 'r') as f:
first_file_lines = f.readlines()
with open(filename, 'r') as f:
second_file_lines = f.readlines()
# your logic on first_file_lines and second_file_lines here
在阅读完所有内容之后,您不需要保持文件处于打开状态。
答案 3 :(得分:1)
在使用open
创建文件对象后,立即调用readlines()
方法,其结果随后绑定到变量,即firstfile
不是文件,而是列表字符串(文件中的行),而对实际文件的引用丢失。 secondFile
也是如此。试试这个:
firstFile = open(jobname, 'r')
lines = firstFile.readlines()
...
firstFile.close()