raw_input()中的Python EOF错误



我试图在命令提示符下获得用户的输入。程序以"cat text.txt | ./script.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是读取从猫在这种情况下,因为它已经达到EOF,这就是为什么raw_input得到EOF在这里?(我认为)目标是让脚本打印标准错误警告,让我选择是否忽略警告并继续或完全退出。最后,所有输出都输出到std out,并且不包含任何错误警告或响应。我见过使用try/exception的例子,但在这种情况下我无法理解它。(如。为什么raw_input不等待输入?)

我想我可能只是以错误的方式处理这个问题,从而产生了一个问题,可以更好地绕过而不是跳过。任何帮助我们都会一如既往地感激。

这在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的输出,这是在EOF。

我的建议是消除cat。这是不必要的;Python完全能够自己读取文件。在命令行上传递文件名,打开它,并自己读取它。

import sys
for line in open(sys.argv[1]):
    # process line

如果您需要处理多个文件,请查看fileinput模块;它可以轻松地处理读取多个文件,就像它们是一个文件一样,这就是cat为您所做的。

目标是让脚本打印一个标准错误警告,并让我选择是否忽略警告并继续或完全退出。

您希望选择来自交互式提示,而数据来自文件?好了,现在你要做的事情和原来的程序不一样了:你要从不同的地方读到这两个东西,它们以前是来自同一个地方的。所以你需要更新你的设计来考虑到这一点。

为什么raw_input不等待输入

raw_input等待所需的时间以获得一行输入。如果标准输入是从文件重定向的,那么输入行总是立即可用的(好吧,受到例如硬盘速度的限制),直到EOF,此时再也没有可用的输入行了。简而言之,它不会等待您回答问题,原因与它不会等待您提供发票数据相同:因为一旦您从文件重定向,您就不再是数据源了。

最新更新