创建一个Python函数,打开文本文件,读取、分词,并可从命令行或作为模块运行

0 投票
4 回答
2725 浏览
提问于 2025-04-16 04:06

我最近一直在尝试学习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

这里有一些你需要修正的地方:

  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 来生成词汇和频率分布。
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')

撰写回答