Я уже давно пытаюсь выучить Python. Случайно я наткнулся на 6-ю главу официального руководства через ссылку поиска Google, указывающую здесь. Когда я узнал на этой странице, что функции - это сердце модулей, и что модули можно вызывать из командной строки, я был полностью утомлен. Вот моя первая попытка сделать оба, 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

Итак, что я могу сделать, чтобы исправить это, и, надеюсь, продолжить долгий извилистый путь к просветлению?

0
magnetar 14 Сен 2010 в 00:01

4 ответа

Лучший ответ

Ошибка при выполнении openbook.py

Для первой ошибки вы открываете файл дважды:

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

Вызов обоих file() и open() является излишним. Они оба делают одно и то же. Выберите одно или другое: предпочтительно open().

открытый(...)

open(name[, mode[, buffering]]) → файловый объект

Открыть файл, используя тип file (), возвращает объект файла. Это предпочтительный способ открыть файл.

Ошибка при импорте модуля openbook

Для второй ошибки вам нужно добавить имя модуля:

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

Или импортируйте функцию openbook() в глобальное пространство имен:

>>> from openbook import openbook
>>> openbook('vicocyclometer')
6
John Kugelman 13 Сен 2010 в 20:08

Вот некоторые вещи, которые вам нужно исправить:

  1. nltk.word_tokenize будет терпеть неудачу каждый раз:
    • Функция принимает предложения в качестве аргументов. Убедитесь, что вы используете nltk.sent_tokenize сначала для всего текста, чтобы все работало правильно.
  2. Файлы, которые не рассматриваются:
    • Открывайте файл только один раз.
    • Вы не закрываете файл, как только это будет сделано. Я рекомендую использовать оператор with Python для извлечения текста, так как он автоматически закрывает вещи: 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 для создания словарного запаса и частотного распределения для вас.
1
Tim McNamara 14 Сен 2010 в 01:04

В вашем интерактивном сеансе вы получаете эту ошибку, потому что вам нужно from openbook import openbook. Я не могу сказать, что случилось с командной строкой, потому что строка с ошибкой была обрезана. Возможно, вы пытались open создать объект file. Попробуйте просто передать строку в функцию openbook напрямую.

0
nmichaels 13 Сен 2010 в 20:09

Пытаться

from openbook import *

Вместо того

import openbook

ИЛИ ЖЕ:

import openbook

А затем позвонить с

openbook.openbook("vicocyclometer")
0
Jared Updike 13 Сен 2010 в 20:06