0

我有一个 Python 脚本,我在其中打开两个文件进行读取,当我试图关闭它们时,它会抛出AttributeError: 'list' object has no attribute 'close'错误。

我的脚本摘录如下:

firstFile = open(jobname, 'r').readlines()  
secondFile = open(filename, 'r').readlines()  
{  
    bunch of logic  
}  
firstFile.close()  
secondFile.close()
4

4 回答 4

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...
于 2013-10-15T15:08:22.590 回答
5

.readlines()返回一个列表。你实际上会想做这样的事情:

with open(jobname) as first, open(filename) as second:
    first_lines = first.readlines()
    second_lines = second.readlines()

with块将自动关闭和清理您的文件句柄。

此外,您可能实际上并不需要 readlines,除非您确实希望文件的全部内容都在内存中。您可以直接遍历文件本身:

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
于 2013-10-15T15:09:36.053 回答
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

阅读所有行后,您也不需要保持文件打开。

于 2013-10-15T15:11:40.937 回答
1

使用 创建文件对象后立即open调用该readlines()方法,然后将其结果绑定到变量,即firstfile不是文件,而是字符串列表(文件中的行),而对实际文件的引用丢失. 对secondFile. 试试这个:

firstFile = open(jobname, 'r')
lines = firstFile.readlines()  
...
firstFile.close()
于 2013-10-15T15:08:06.863 回答