Python raw_input()中的EOF错误
我正在尝试在命令提示符下获取用户输入。这个程序是通过“cat text.txt | ./thescript.py”这种方式从一个文本文件中读取数据。
在这个脚本的某个地方,所有的数据已经被读取、处理,并放入了一个列表的列表中。
现在我正在遍历这个列表,寻找一些可疑的项目。代码大致是这样的:
for invoice in parsedlist:
if invoice[-1] == 3:
sys.stderr.write("triple duplicate at " + invoice[2]+' : ' + invoice[3]+"\n")
sys.stderr.write("continue Y or N \n")
answer = raw_input("Type your answer here")
if answer == 'N':
sys.exit(1)
else:
pass`
这段代码导致了一个EOFError(文件结束错误)。根据我目前的理解,在这种情况下,stdin是从cat命令读取的,因为它已经到达了文件结束,所以raw_input在这里也遇到了EOF?(我想是这样)目标是让脚本打印一个警告到标准错误,并让我选择是忽略这个警告继续执行,还是完全退出。最后,所有的输出都会发送到标准输出,不会包含任何错误警告或响应。我见过一些使用try/exception的例子,但在这个上下文中我没能理解它是怎么工作的。(比如,为什么raw_input不等待输入?)
我觉得我可能是用错了方法来解决这个问题,因此造成了一个可以更好地绕过而不是跳过的问题。任何帮助都是非常感谢的。
3 个回答
目标是让这个脚本在标准错误输出中打印一个警告,并让我选择是忽略这个警告继续执行,还是完全退出。
你希望选择是通过一个互动提示来进行,而数据则来自文件?那么你现在做的事情和原来的程序就不一样了:你是从不同的地方读取这两样东西,而之前它们是来自同一个地方。所以你需要更新你的设计来适应这种情况。
为什么
raw_input
不等待输入?
raw_input
会一直等待,直到你输入一行内容。如果标准输入是从一个文件重定向过来的,那么输入的行会立刻可用(当然,这个速度受限于硬盘的速度),直到文件结束(EOF),在那时就不会再有输入了。简单来说,它不等待你回答问题,是因为一旦你从文件中重定向输入,你就不再是数据的来源了。
这个在Windows系统下是可以用的(我通过运行 python cons.py < cons.py
来测试,结果能看到提示信息,也没有出现EOF的错误):
import sys
for line in sys.stdin:
print line
sys.stdin = open('CON', 'r')
q = raw_input('---->')
在Unix系统下,你可能只需要把'CON'换成/dev目录下的某个东西就可以了。
是的,问题在于你的 raw_input()
是从标准输入读取数据,而标准输入的内容是 cat
的输出,而这时候已经到达文件末尾了。
我建议你去掉 cat
。其实没必要用它;Python 自己就能读取文件。你只需要在命令行中传入文件名,然后自己打开文件并读取内容。
import sys
for line in open(sys.argv[1]):
# process line
如果你需要处理多个文件,可以看看 fileinput
模块;它可以很方便地把多个文件当作一个文件来读取,这正是 cat
为你做的事情。