Python Json加载时标准输入失败
我试图使用Windows命令行Python Json加载时标准输入失败,python,json,python-3.x,file-io,user-input,Python,Json,Python 3.x,File Io,User Input,我试图使用Windows命令行python algo.py
python algo.py
和脚本中的json.loads(sys.stdin)
加载json文件,但失败了
但是,我可以使用
with open('number.json',encoding='utf-8-sig') as f:
n = json.loads(f)
使用json.load(sys.stdin)
时引发异常:
JSON对象必须是str、bytes或bytearray,而不是TextIOWrapper
使用json.load(sys.stdin)或json.load(sys.stdin.read())
时引发异常:
期望值:第1行第1列(字符0)
有人遇到过同样的问题吗?在请求帮助之前,我在这个论坛上阅读了多篇帖子
以下是json文件:
[
{
"x": 1,
"y": 4,
"z": -1,
"t": 2
},
{
"x": 2,
"y": -1,
"z": 3,
"t": 0
}
]
根据您的评论,您的问题似乎是您的文件中有前缀。这意味着额外的三个字节
0xEF 0xBB 0xBF
首先在文件中找到
Pythonjson
模块表示它不接受BOM。因此,在将JSON数据传递到JSON.load
或JSON.load
之前,必须删除它
至少有三种方法可以删除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
引用utf-8-sig的原因:
在某些地区,在UTF-8编码文件的开头使用“BOM”也是惯例;该名称具有误导性,因为UTF-8不依赖于字节顺序。该标记只是宣布该文件以UTF-8编码。要读取此类文件,请使用“utf-8-sig”编解码器自动跳过标记(如果存在)
json.load(sys.stdin)
(不带s
)load
和load
都会使用sys.stdin
方法失败。错误消息到底是什么json.load(sys.stdin)
适用于我的json文件。例外情况是,它应该是字符串,字节,而不是“TextIOWrapper”@klauds.json.load(open('number.json'))肯定会工作!