エラー メッセージIOError: [Errno 2] No such file or directory: 'words.txt'
は、Python がファイルwords.txt
を探している場所でファイルを見つけることができないことを意味します。
Python はどこでファイルを探していますか?
に渡された文字列がopen()
絶対パスのように見える場合、Python はそこを検索します。'words.txt'
は絶対パスのように見えないため、相対パスとして扱われます。何に対して?予想とは異なり、Python ソース ファイルに対して相対的ではなく、現在の作業ディレクトリに対して相対的です。
対話型シェルからスクリプトを呼び出した場合は、適用可能な現在の作業ディレクトリがわかっている可能性があります。Qpythonで開発するときにそれができる/できる人であるかどうかはわかりません。しかし、そうでない場合でも心配はいりません。
import os
print os.getcwd()
現在の作業ディレクトリのパスを出力します。これは、ファイルをどこに置くか、またはファイルにアクセスする方法を理解するのに役立ちます。
Pythonでのインデントの問題
実際の例外のメッセージが出力されることは、デバッグに適しています。ただし、except ブロックがあるため、意図したものではない可能性があります。「無効なファイル名」を出力したい場合は、try ブロックのインデントを修正する必要があります。(fhand = open('words.txt')
に対してインデントする必要がありますtry:
。)
これがまったく実行されたのに、IndentationError: expected an indented block
.
適切な例外処理
正しく処理できる (そして実行できる) ものだけをキャッチする
try
ブロックが修正されると (上記のセクションを参照)、except
ブロックはブロック内のすべての例外をキャッチすることに注意してくださいIOError: [Errno 2] No such file or directory
。open
これは、割り当てる RAM が不足しているなど、 にまったく別の問題がある場合でも、「無効なファイル名」を出力することを意味します。
except
そのため、ブロックで処理する特定のエラーをキャッチしてみてください。
エラー メッセージに stderr を使用する
と
print >> sys.stderr, "Invalid Filename "
標準出力ストリームの代わりに標準エラー ストリームに出力できます。これは、スクリプトの標準出力がファイルにリダイレクトされる場合に役立ちます。
ユーザー入力の使用
現在、ハードコードされたファイル名を使用しており、プロンプトが表示されたときにユーザーが入力した名前で何もしていませんEnter a File Name:
。デバッグが完了したら、ハードコードされたファイル名を に置き換えると思いますimp
。ここではユーザー入力が保持されます。置き換えるだけで、ユーザーはファイル名だけでなく、スクリプトがアクセスするファイル パス (現在の作業ディレクトリに対する絶対パスまたは相対パス) を指定できるようになることに注意してください。これは、許可したい場合とそうでない場合があります。