Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Json加载时标准输入失败_Python_Json_Python 3.x_File Io_User Input - Fatal编程技术网

Python Json加载时标准输入失败

Python Json加载时标准输入失败,python,json,python-3.x,file-io,user-input,Python,Json,Python 3.x,File Io,User Input,我试图使用Windows命令行python algo.py

我试图使用Windows命令行
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
首先在文件中找到

Python
json
模块表示它不接受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'))肯定会工作!