2011-07-26 84 views
1

我试图在命令提示符下从用户处获得输入。该程序以“cat text.txt | ./thescript.py”的形式从文本文件中读取数据。raw_input()中的Python EOF错误

在所涉脚本的位置,所有数据已被读入,处理并放入列入清单。

现在我通过列表寻找可疑项目的列表。代码基本如下所示:

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在这里? (我认为)目标是让脚本打印标准错误警告,并让我选择是否忽略警告并继续或完全退出。最后,所有输出都会显示出来,并且不会包含任何错误警告或响应。我看过使用try/exception的例子,但在这种情况下我还没有弄清楚它的意义。 (例如,为什么raw_input不会等待输入?)

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

+0

对不起,缩进。他们是在原来的。 – Wyatt

+1

'cat text.txt | 。/ thescript.py'通常拼写为'./thescript.py

+0

除非他简化了左侧,所以它不会分散我们的手头问题......; –

回答

2

是的,问题是您的raw_input()正在从标准输入读取,这是cat的输出,它位于EOF处。我的建议是取消cat。没有必要; Python完全能够自行读取文件。在命令行上传递文件名,将其打开并自己阅读。

import sys 

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

如果您需要处理多个文件,检查出fileinput模块;它很容易处理阅读多个文件,就好像它们是一样,这就是cat为你做的。

+0

我认为这是一个“四处走动”而不是“跳过”!谢谢。现在看起来很明显,你说过。壳牌是一个很难打破的习惯。 :) – Wyatt

+0

'猫'即使在外壳也可能是一个坏习惯。除非实际连接文件,否则通常可以通过将标准输入重定向到文件来保存进程。例如'猫foo | grep bar'和'grep bar kindall

1

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

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

为什么不的raw_input等待输入

raw_input等待,只要是需要得到一个线路输入的。如果标准输入从文件重定向,则输入行总是立即可用(当然,受到例如硬盘速度的限制),直到EOF,此时不会有更多的输入可用。简而言之,它不会等待您回答问题,因为它不会等待您提供发票数据:因为您从文件重定向后不再是数据源。

3

这工作窗口下(我通过运行测试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目录中。