Создание функции Python, которая открывает текстовый файл, читает его, маркирует его и, наконец, запускается из командной строки или в виде модуля - PullRequest
0 голосов
/ 14 сентября 2010

Я уже некоторое время пытаюсь выучить 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

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

Ответы [ 4 ]

6 голосов
/ 14 сентября 2010

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

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

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

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

открыт (...)

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

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

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

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

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

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

>>> from openbook import openbook
>>> openbook('vicocyclometer')
1 голос
/ 14 сентября 2010

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

  1. nltk.word_tokenize будет каждый раз завершаться ошибкой:
    • Функция принимает предложения в качестве аргументов.Сначала убедитесь, что вы используете nltk.sent_tokenize для всего текста, чтобы все работало правильно.
  2. Файлы, с которыми вы не работали:
    • Откройте файл только один раз.
    • Вы не закроете файл, как только это будет сделано.Я рекомендую использовать оператор with Python для извлечения текста, так как он автоматически закрывает вещи: with open(book) as raw: nltk.sent_tokenize(raw) ...
  3. Импортируйте функцию openbook из модуля, а не толькоmodule: from openbook import openbook.

Наконец, вы можете рассмотреть:

  1. Добавление вещей в набор с помощью выражения генератора, что, вероятно, уменьшит нагрузку на память: set(w.lower() for w in text)
  2. Использование nltk.FreqDist для генерации вокаба и распределения частот для вас.
0 голосов
/ 14 сентября 2010

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

0 голосов
/ 14 сентября 2010

Попробуйте

from openbook import *

вместо

import openbook

OR

import openbook

, а затем позвоните по номеру

openbook.openbook("vicocyclometer")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...