JSON加载stdin失败



我正在尝试使用Windows命令行加载我的JSON文件:python algo.py < number.json:CC_2并在我的脚本中使用json.loads(sys.stdin),但它失败了。

但是,我可以用

加载我的JSON
with open('number.json',encoding='utf-8-sig') as f:
n = json.loads(f)

使用json.loads(sys.stdin)时会引起异常:

the JSON object must be str, bytes or bytearray, not TextIOWrapper

使用 json.load(sys.stdin) or json.loads(sys.stdin.read())时提出异常:

Expecting value: line 1 column 1 (char 0)

有人遇到同样的问题吗?我在此论坛上阅读了多个帖子,请求帮助。

这是JSON文件:

[
  {
    "x": 1,
    "y": 4,
    "z": -1,
    "t": 2
  },
  {
    "x": 2,
    "y": -1,
    "z": 3,
    "t": 0
  }
]

基于您的评论,您的问题似乎是您将UTF-8 BOM添加到文件中。这意味着首先在文件中找到了额外的三个字节0xEF 0xBB 0xBF

Python json模块文档说它不接受BOM。因此,您必须在将JSON数据传递给stdin0或json.loads之前将其删除。

至少有三种方法可以去除BOM。最好的是简单地编辑您的JSON文件即可将其删除。如果不可能,您可以在Python代码中跳过它。

如果仅需要代码与包含BOM的文件一起工作,则可以使用:

assert b'xEFxBBxBF' == sys.stdin.buffer.read(3)

这确保删除的字节确实是UTF-8 BOM。

如果您需要使用可能包含或可能不包含BOM的文件,则可以用TextIOWrapper用正确的编码包装标准输入流,如本答案中所述。然后代码看起来像这样:

import io
stdin_wrapper = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8-sig')
# use stdin_wrapper instead of stdin

引用Python Unicode Howto为何utf-8-sig

在某些领域,在UTF-8编码文件的开头使用" BOM"也是惯例。该名称具有误导性,因为UTF-8不是字节订单依赖性。该商标简单地宣布该文件是在UTF-8中编码的。要读取此类文件,请使用" UTF-8-SIG"编解码器自动跳过标记(如果存在(。

相关内容

  • 没有找到相关文章

最新更新