创建一个Python函数,该函数打开一个文本文件,读取它,标记它,最后从命令行或作为模块运行
我已经尝试学习Python有一段时间了。碰巧,我通过谷歌搜索链接浏览了官方教程的第6章 . 当我从那一页了解到函数是模块的核心,并且可以从命令行调用模块时,我洗耳恭听。这是我第一次尝试两者兼而有之,openbook.py创建一个Python函数,该函数打开一个文本文件,读取它,标记它,最后从命令行或作为模块运行,python,nltk,Python,Nltk,我已经尝试学习Python有一段时间了。碰巧,我通过谷歌搜索链接浏览了官方教程的第6章 . 当我从那一页了解到函数是模块的核心,并且可以从命令行调用模块时,我洗耳恭听。这是我第一次尝试两者兼而有之,openbook.py import nltk, re, pprint from __future__ import division def openbook(book): file = open(book) raw = file.read() tokens = nltk.
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
当我尝试将其用作模块时,会发生以下情况:
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
那么,我能做些什么来解决这个问题,并希望继续沿着漫长曲折的道路走向启蒙呢?试试看
from openbook import *
而不是
import openbook
或:
然后用你的名字来称呼它
openbook.openbook("vicocyclometer")
执行openbook.py时出错
对于第一个错误,您将打开文件两次:
openbook(file(sys.argv[1]))
ph0 = open(book)
调用file和open是多余的。他们都做同样的事情。选择一个或另一个:最好打开
打开
openname[,模式[,缓冲]]→ 文件对象
使用文件类型打开文件,返回文件对象。这是
打开文件的首选方式
导入openbook模块时出错
对于第二个错误,您需要添加模块名称:
>>> import openbook
>>> openbook.openbook('vicocyclometer')
或将openbook函数导入全局命名空间:
>>> from openbook import openbook
>>> openbook('vicocyclometer')
在交互式会话中,您会收到该错误,因为您需要从openbook导入openbook。我不知道命令行发生了什么,因为有错误的行被截断了。可能是您试图打开一个文件对象。尝试直接将字符串传递到openbook函数中。以下是一些需要修复的问题: nltk.word\u标记化每次都会失败: 该函数将句子作为参数。确保首先在整个文本上使用nltk.sent\u标记化,以便正确工作。 未处理的文件: 只打开文件一次。 一旦文件完成,您就不能关闭它。我建议使用Python的with语句来提取文本,因为它会自动关闭内容:使用openbook作为原始:nltk.sent_tokenizeraw。。。 从模块导入openbook函数,而不仅仅是模块:从openbook导入openbook。 最后,你可以考虑: 使用生成器表达式向集合中添加内容,这可能会减少内存负载:setw.lower表示文本中的w 使用nltk.FreqDist为您生成语音和频率分布。
无需导入您不使用的内容,例如pprint、re&DIVISON,无需导入,但它实际上使所有这些输入变得更简单。像你这样的答案有时在网上很难找到。至于你的第五点,在一本单字出现不止一次的书上使用FreqDist没有多大意义。如果你只是测试vocab,那么不需要频率分布。不过,这对进一步分析很有用。好的,谢谢你提供的信息。当我在底部取出if语句时,它起作用了。我试图做的是使Python作为带有可选参数的命令行脚本运行,如Python教程的第6章: