Json加载,标准输入失败

时间:2019-07-01 09:43:29

标签: python json python-3.x file-io user-input

我试图使用Windows命令行stdinpython algo.py < number.json在脚本中使用json.loads(sys.stdin)来加载json文件,但是失败。

但是,我可以使用

加载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
  }
]

1 个答案:

答案 0 :(得分:0)

根据您的评论,您的问题似乎是您在文件前加上了UTF-8 BOM。这意味着多余的三个字节0xEF 0xBB 0xBF首先在文件中找到。

Python json模块documentation说它不接受BOM。因此,您必须先删除它,然后再将JSON数据传递到json.loadjson.loads

至少有三种方法可以删除BOM。最好的办法就是简单地编辑JSON文件将其删除。如果无法做到这一点,则可以在Python代码中跳过它。

如果只需要您的代码来处理包含BOM的文件,则可以使用:

assert b'\xEF\xBB\xBF' == 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 ,如this answer所述。然后代码如下所示:

utf-8-sig

Python Unicode HOWTO引述i的原因:

  

在某些地区,在UTF-8编码文件的开头还使用“ BOM”是一种惯例。该名称具有误导性,因为UTF-8与字节顺序无关。标记只是宣布文件已以UTF-8编码。要读取此类文件,请使用“ utf-8-sig”编解码器自动跳过标记(如果存在)。