【问题标题】:Trouble with Python JSON input from STDIN来自 STDIN 的 Python JSON 输入问题
【发布时间】:2018-05-04 17:35:58
【问题描述】:
input = json.load(sys.stdin)
print(input['id'])

当我输入 {"id":1} 并按回车键时,我的程序无法继续,我只是卡在输入中。将有效的 json 传递给我的 stdlin 后,如何使程序继续运行?

【问题讨论】:

  • 您必须关闭该文件。在 Linux 和其他类 Unix 系统上,您可以通过按 Ctrl-D 来执行此操作。我认为在 Windows 上你需要 Ctrl-Z,但我对 Windows 了解不多。
  • 顺便说一句,您忘记在代码中包含 import 语句。并且不要使用input 作为变量名,这会影响内置的input 函数。
  • 非常清楚——这是python库中的一个BUG。解析 JSON 对象的结尾时非常清楚(只需要一个字符前瞻)。一些 JSON 解析库 (c++) 可以正确执行此操作,因此上述用法(从标准输入读取)可以正常工作;这个阅读器 github.com/SophistSolutions/Stroika/blob/v2.1b9/Library/Sources/…> 最多只向前看一个字符来找到 JSON 的结尾。
  • 这不是错误。 json.load 获取一个打开的文件并读取其全部内容,文档声明它使用 read() 来执行此操作。

标签: json python-3.x stdin


【解决方案1】:

当您从sys.stdin 读入时,它会读取所有内容,直到遇到 EOF 字符,通常是 ctrl-d,所以如果您输入 {"id":1} <ENTER> ctrl-d,它应该可以工作。

看起来你正在尝试做的事情是这样的

import json
json_as_str = input()
json_obj = json.loads(json_as_str)
print(json_obj['id'])

【讨论】:

    【解决方案2】:

    我通过粘贴两行以交互方式尝试代码,然后意识到第二行被解释为第一行正在读取的 JSON 的一部分!作为一个模块,代码可以完美地工作。可见输入后面是换行符和控制台上的 CTRL/D。

    sholden$ cat /tmp/py.py
    import json, sys
    input = json.load(sys.stdin)
    print(input['id'])
    sholden$ python /tmp/py.py
    {"id": 42}
    42
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 2015-10-07
      • 2012-06-04
      • 2012-04-24
      • 1970-01-01
      相关资源
      最近更新 更多