我正在尝试使用Windows命令行加载我的JSON文件:python algo.py < number.json
:CC_2并在我的脚本中使用json.loads(sys.stdin)
,但它失败了。
但是,我可以用
加载我的JSONwith 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数据传递给stdin
0或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"编解码器自动跳过标记(如果存在(。