该错误消息IOError: [Errno 2] No such file or directory: 'words.txt'
意味着 Python 无法words.txt
在它正在查找的位置找到该文件。
Python 在哪里寻找文件?
如果传递给的字符串open()
看起来像一个绝对路径,Python 会在那里查找。'words.txt'
看起来不像绝对路径,所以它被视为相对路径。相对于什么?出乎你的意料,不是相对于你的 python 源文件,而是相对于当前工作目录。
如果您从交互式 shell 调用脚本,您可能知道适用的当前工作目录。我不知道在使用 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
(例如内存不足无法分配)时,您也会输出“Invalid Filename”。
因此,请尝试捕获您将在except
块中处理的特定错误。
使用 stderr 获取错误消息
和
print >> sys.stderr, "Invalid Filename "
您可以打印到标准错误流而不是标准输出流。如果您的脚本的标准输出被重定向到文件,这将很有用。
使用用户输入
您当前正在使用硬编码的文件名,并且对用户在提示时输入的名称不做任何事情Enter a File Name:
。我想一旦你完成调试,你将用 替换硬编码的文件名imp
,这里包含用户输入。请注意,仅通过替换它,您将允许用户不仅指定文件名,还允许您的脚本随后访问的文件路径(绝对或相对于当前工作目录)。这可能是也可能不是您想要允许的。