【问题标题】:Python EOF Error in raw_input()raw_input() 中的 Python EOF 错误
【发布时间】:2011-07-26 16:41:42
【问题描述】:

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

我想我可能只是以错误的方式解决了这个问题,从而产生了一个最好绕着走然后跳过的问题。一如既往地感谢任何帮助。

【问题讨论】:

  • 抱歉缩进。它们在原版中。
  • cat text.txt | ./thescript.py 通常拼写为./thescript.py < text.txt。
  • 除非他简化了左侧,所以它不会分散我们对手头问题的注意力...... ;)

标签: python input eoferror


【解决方案1】:

这在 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 目录中的内容。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我以为这是“四处走走”而不是“跳过”!谢谢。既然你这么说,似乎有点明显。 Shell 是一个很难改掉的习惯。 :)
    • cat 即使在 shell 中也可能是一个坏习惯。除非您实际上是在连接文件,否则通常可以通过将标准输入重定向到文件来保存进程。例如cat foo | grep bar 与 grep bar <foo 相同,只是少了一个进程。
    【解决方案3】:

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

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

    为什么 raw_input 不等待输入

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

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 2011-04-06
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多