创建一个Python函数,打开文本文件,读取、分词,并可从命令行或作为模块运行
我最近一直在尝试学习Python。偶然间,我通过谷歌搜索找到了官方教程的第六章,链接在这里。在那一页上,我了解到函数是模块的核心,而且模块可以从命令行调用,这让我非常感兴趣。这是我第一次尝试做这两件事,文件名是openbook.py。
import nltk, re, pprint
from __future__ import division
def openbook(book):
file = open(book)
raw = file.read()
tokens = nltk.wordpunct_tokenize(raw)
text = nltk.Text(tokens)
words = [w.lower() for w in text]
vocab = sorted(set(words))
return vocab
if __name__ == "__main__":
import sys
openbook(file(sys.argv[1]))
我希望这个函数可以作为模块openbook被导入,同时也希望openbook.py能够从命令行接收一个文件,并对它进行所有相关操作。
当我从命令行运行openbook.py时,出现了这样的情况:
gemeni@a:~/Projects-FinnegansWake$ python openbook.py vicocyclometer
Traceback (most recent call last):
File "openbook.py", line 23, in <module>
openbook(file(sys.argv[1]))
File "openbook.py", line 5, in openbook
file = open(book)
当我尝试把它当作模块使用时,发生了这样的事情:
>>> import openbook
>>> openbook('vicocyclometer')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
那么,我该怎么做才能解决这个问题,并希望能继续在这条漫长而曲折的学习道路上前进呢?
4 个回答
0
试试
from openbook import *
而不是
import openbook
或者:
import openbook
然后用这个来调用它
openbook.openbook("vicocyclometer")
1
这里有一些你需要修正的地方:
nltk.word_tokenize
每次都会出错:- 这个函数需要句子作为输入。你需要先用
nltk.sent_tokenize
把整个文本分成句子,这样才能正常工作。
- 这个函数需要句子作为输入。你需要先用
- 文件处理不当:
- 只需要打开文件一次。
- 完成后没有关闭文件。我建议使用 Python 的
with
语句来提取文本,因为它会自动关闭文件:with open(book) as raw: nltk.sent_tokenize(raw)
...
- 从模块中导入
openbook
函数,而不仅仅是导入模块:from openbook import openbook
。
最后,你可以考虑:
- 使用生成器表达式来添加元素到集合,这样可能会减少内存使用:
set(w.lower() for w in text)
- 使用
nltk.FreqDist
来生成词汇和频率分布。
6
执行 openbook.py 时出错
对于第一个错误,你是把文件打开了两次:
openbook(file(sys.argv[1]))
ph0 = open(book)
调用 file()
和 open()
是多余的。它们的功能是一样的。你只需要选择其中一个,建议使用 open()
。
open(...)
open(name[, mode[, buffering]])
→ 文件对象使用 file() 类型打开一个文件,返回一个文件对象。这是打开文件的推荐方法。
导入 openbook 模块时出错
对于第二个错误,你需要添加模块名称:
>>> import openbook
>>> openbook.openbook('vicocyclometer')
或者把 openbook()
函数导入到全局命名空间中:
>>> from openbook import openbook
>>> openbook('vicocyclometer')