0

我一直在尝试学习 Python 一段时间。一次偶然的机会,我通过指向此处的 Google 搜索链接偶然看到了官方教程的第 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

那么,我能做些什么来解决这个问题,并希望继续沿着漫长而曲折的道路走向启蒙呢?

4

4 回答 4

6

执行 openbook.py 时出错

对于第一个错误,您打开文件两次:

openbook(file(sys.argv[1]))
ph0 = open(book)

同时调用file()andopen()是多余的。他们都做同样的事情。选择一个或另一个:最好open()

打开(...)

open(name[, mode[, buffering]])→ 文件对象

使用 file() 类型打开一个文件,返回一个文件对象。这是打开文件的首选方式。

导入 openbook 模块时出错

对于第二个错误,您需要添加模块名称:

>>> import openbook
>>> openbook.openbook('vicocyclometer')

或者将openbook()函数导入全局命名空间:

>>> from openbook import openbook
>>> openbook('vicocyclometer')
于 2010-09-13T20:08:02.577 回答
1

以下是您需要解决的一些问题:

  1. nltk.word_tokenize每次都会失败:
    • 该函数将句子作为参数。确保首先使用nltk.sent_tokenize整个文本,这样事情才能正常工作。
  2. 未处理的文件:
    • 只打开一次文件。
    • 完成后,您不会关闭文件。我建议使用 Python 的with语句来提取文本,因为它会自动关闭内容:with open(book) as raw: nltk.sent_tokenize(raw)...
  3. 从模块导入openbook函数,而不仅仅是模块:from openbook import openbook.

最后,您可以考虑:

  1. 使用生成器表达式将东西添加到集合中,这可能会减少内存负载:set(w.lower() for w in text)
  2. 用于nltk.FreqDist为您生成词汇和频率分布。
于 2010-09-14T01:04:45.287 回答
0

尝试

from openbook import *

代替

import openbook

或者:

import openbook

然后用

openbook.openbook("vicocyclometer")
于 2010-09-13T20:06:35.493 回答
0

在您的交互式会话中,您会收到该错误,因为您需要from openbook import openbook. 我不知道命令行发生了什么,因为有错误的行被剪断了。可能是您尝试了open一个file对象。尝试直接将字符串传递给 openbook 函数。

于 2010-09-13T20:09:23.020 回答