我正在分析单词频率的文本,并在完成后收到此错误消息:
'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()
答案 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()
text
是str
,因为这是.read()
返回的内容。它没有一个密切的方法。文件对象具有close方法,但您没有将打开的文件分配给名称,因此您无法再引用它来关闭它。
我建议使用with
语句来管理文件:
with open("catinhat.txt") as f:
text = f.read()
...
with
语句将关闭文件,无论块是成功完成还是引发异常。