创建一个Python函数,该函数打开一个文本文件,读取它,标记它,最后从命令行或作为模块运行

创建一个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.

我已经尝试学习Python有一段时间了。碰巧,我通过谷歌搜索链接浏览了官方教程的第6章 . 当我从那一页了解到函数是模块的核心,并且可以从命令行调用模块时,我洗耳恭听。这是我第一次尝试两者兼而有之,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
当我尝试将其用作模块时,会发生以下情况:

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章: