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 の実行中にエラーが発生しました

最初のエラーでは、ファイルを 2 回開いています。

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

file()と の両方を呼び出すのopen()は冗長です。どちらも同じことをします。どちらかを選択してください。できればopen().

開いた(...)

open(name[, mode[, buffering]])→ファイルオブジェクト

file() 型を使用してファイルを開き、ファイル オブジェクトを返します。これは、ファイルを開くための推奨される方法です。

openbook モジュールのインポート中にエラーが発生しました

2 番目のエラーについては、モジュール名を追加する必要があります。

>>> 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. 処理されていないファイル:
    • ファイルは 1 回だけ開きます。
    • 完了したら、ファイルを閉じません。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語彙と頻度分布を生成するために使用します。
于 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。エラーのある行が切り取られたため、コマンドラインで何が起こったのかわかりません。それはおそらくあなたがオブジェクトにしようとしopenfileことです。文字列を openbook 関数に直接渡してみてください。

于 2010-09-13T20:09:23.020 に答える