我试图使用Windows命令行stdin
和python 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
}
]
答案 0 :(得分:0)
根据您的评论,您的问题似乎是您在文件前加上了UTF-8 BOM。这意味着多余的三个字节0xEF 0xBB 0xBF
首先在文件中找到。
Python json
模块documentation说它不接受BOM。因此,您必须先删除它,然后再将JSON数据传递到json.load
或json.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”编解码器自动跳过标记(如果存在)。