raw_input()中的Python EOF错误

时间:2011-07-26 16:41:42

标签: python input eoferror

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

我想我可能只是以错误的方式攻击这个问题,从而产生一个问题,可以更好地走动,然后跳过。任何帮助一如既往地受到赞赏。

3 个答案:

答案 0 :(得分:3)

这适用于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下,您可能只需要用/ dev目录中的某些内容替换'CON'。

答案 1 :(得分:2)

是的,问题是您的raw_input()正在从标准输入读取,这是cat的输出,即EOF。

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

import sys

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

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

答案 2 :(得分:1)

  

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

您希望选择来自交互式提示,而数据来自文件?那么,现在你正在做一些与原始程序不同的事情:你正在从不同的地方读取这两件事,他们之前来自同一个地方。所以你需要更新你的设计才能实现这一点。

  

为什么raw_input不等待输入

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