str对象没有属性'close'

时间:2015-11-11 01:40:16

标签: python text-analysis

我正在分析单词频率的文本,并在完成后收到此错误消息:

'str' object has no attribute 'close'

之前我使用过close()方法所以我不知道该怎么做。

以下是代码:

def main():
    text=open("catinhat.txt").read()
    text=text.lower()
    for ch in '!"$%&()*+,-./:;<=>=?@[\\]^_{|}~':
        text=text.replace(ch,"")
    words=text.split()
    d={}
    count=0
    for w in words:
        count+=1
        d[w]=d.get(w,0)+1

    d["#"]=count
    print(d)
    text.close()
main()

3 个答案:

答案 0 :(得分:2)

您没有保存对文件句柄的引用。您打开文件,读取其内容并保存生成的字符串。没有要关闭的文件句柄。避免这种情况的最佳方法是使用with上下文管理器:

def main():
    with open("catinhat.txt") as f:
        text=f.read()
        ...

这将在with块结束后自动关闭文件,而不会显示f.close()

答案 1 :(得分:0)

这是因为你的variable文本有一种字符串(当你从文件中读取竞赛时)。

让我告诉你一个确切的例子:

>>> t = open("test.txt").read()
#t contains now 'asdfasdfasdfEND' <- content of test.txt file
>>> type(t)
<class 'str'>

>>> t.close()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'close'

如果对open()函数使用辅助变量(返回_io.TextIOWrapper),则可以将其关闭:

>>> f = open("test.txt")
>>> t = f.read() # t contains the text from test.txt and f is still a _io.TextIOWrapper, which has a close() method
>>> type(f)
<class '_io.TextIOWrapper'>
>>> f.close() # therefore I can close it here
>>>

答案 2 :(得分:0)

text=open("catinhat.txt").read()

textstr,因为这是.read()返回的内容。它没有一个密切的方法。文件对象具有close方法,但您没有将打开的文件分配给名称,因此您无法再引用它来关闭它。

我建议使用with语句来管理文件:

with open("catinhat.txt") as f:
    text = f.read()
    ...

with语句将关闭文件,无论块是成功完成还是引发异常。