Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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 Requests - Fatal编程技术网

请求-Python解析JSON错误-使用编解码器加载

请求-Python解析JSON错误-使用编解码器加载,python,json,python-requests,Python,Json,Python Requests,我试图用python和请求解析api中的数据 参考文献 及 上面列出了多个引用,因为我已经用收到的每个错误更新了脚本 import requests import codecs import json r = requests.get( "https://api.tatts.com/sales/vmax/web/data/racing/2017/4/05/mr/") data = json.load(codecs.open(r.json(), 'utf-8-sig')) # reads

我试图用python和请求解析api中的数据

参考文献 及

上面列出了多个引用,因为我已经用收到的每个错误更新了脚本

import requests
import codecs
import json

r = requests.get(
    "https://api.tatts.com/sales/vmax/web/data/racing/2017/4/05/mr/")
data = json.load(codecs.open(r.json(), 'utf-8-sig'))
# reads = r.json()
# data = reads.decode('utf-8-sig')

with open('data.json', 'w') as f:
    json.dump(data, f)
我想将api的响应保存到file.json中

最初,我从so参考答案中收到以下so应用的编解码器分辨率

json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)
这个决议来自于这样的回答

data = json.load(codecs.open(r.json(), 'utf-8-sig'))
现在我收到了错误消息

TypeError: expected str, bytes or os.PathLike object, not dict
但是,我无法解决类型错误,因为我需要使用编解码器加载以停止ut8 sig错误

如何解析和写入请求并避免这两个错误

编辑

使用以下答案更新,但无法将文件写入磁盘

import requests
import codecs
import json

r = requests.get(
    "https://api.tatts.com/sales/vmax/web/data/racing/2017/4/05/mr/")
data = json.load(codecs.open(r.text, 'r', 'utf-8-sig'))

with open('data.json', 'w') as f:
    f.write(data)
回答

import requests
import json

r = requests.get(
    "https://api.tatts.com/sales/vmax/web/data/racing/2017/4/05/mr/")

output = open('data.json', 'w')
output.write(r.text)

codecs.open
使用给定编码打开本地文件。将转换内存中的对象。所以我认为你在追求:

data = json.load(codecs.decode(r.text, 'utf-8-sig'))
注意,我使用了
r.text
,这意味着请求库不会尝试自己进行任何解析。除非您想在保存之前修改数据,否则您可以直接将响应保存到磁盘:

with open('data.json', 'w') as f:
    f.write(r.text)

codecs.open
使用给定编码打开本地文件。将转换内存中的对象。所以我认为你在追求:

data = json.load(codecs.decode(r.text, 'utf-8-sig'))
注意,我使用了
r.text
,这意味着请求库不会尝试自己进行任何解析。除非您想在保存之前修改数据,否则您可以直接将响应保存到磁盘:

with open('data.json', 'w') as f:
    f.write(r.text)

回答你最新的问题。您没有达到将数据写入文件的代码,如果您向上滚动输出,我相信您得到的错误是:

IOError:[Errno 63]文件名太长:

codecords.open(r.text,'r','utf-8-sig')
的第一个参数是
filename
,如下所示。我认为Alex Taylor的回答足以写一个文件的响应,但是 如果您确实需要解码响应,您可以尝试:

data = codecs.decode(str(response.text), 'utf-8-sig')
代码中的另一个错误:
data=json.load(codecs.open(r.text,'r','utf-8-sig'))
make
data
要成为
unicode
的类型,不能将
unicode
对象写入文件。您可以将其转储到您的文件中:

import requests
import json
import codecs

r = requests.get("https://api.tatts.com/sales/vmax/web/data/racing/2017/4/05/mr/")
data = codecs.decode(str(r.text), 'utf-8-sig')

with open('data.json', 'w') as f:
    json.dump(data, f)
您可以稍后使用以下代码将其加载回:

with open('data.json', 'r') as f:
    data = json.load(f)

回答你最新的问题。您没有达到将数据写入文件的代码,如果您向上滚动输出,我相信您得到的错误是:

IOError:[Errno 63]文件名太长:

codecords.open(r.text,'r','utf-8-sig')
的第一个参数是
filename
,如下所示。我认为Alex Taylor的回答足以写一个文件的响应,但是 如果您确实需要解码响应,您可以尝试:

data = codecs.decode(str(response.text), 'utf-8-sig')
代码中的另一个错误:
data=json.load(codecs.open(r.text,'r','utf-8-sig'))
make
data
要成为
unicode
的类型,不能将
unicode
对象写入文件。您可以将其转储到您的文件中:

import requests
import json
import codecs

r = requests.get("https://api.tatts.com/sales/vmax/web/data/racing/2017/4/05/mr/")
data = codecs.decode(str(r.text), 'utf-8-sig')

with open('data.json', 'w') as f:
    json.dump(data, f)
您可以稍后使用以下代码将其加载回:

with open('data.json', 'r') as f:
    data = json.load(f)

您需要使用
r.json()
有什么原因吗?为什么不直接将
r.text
写入文件?是否有理由使用
r.json()
?为什么不直接将
r.text
写入文件?已更新,需要在编解码器调用中添加“r”。但是,它仍然无法写入json文件,而不是在控制台中打印出来。我需要使用
r.content
,而不是
r.content
,因为
codecs.decode
需要二进制输入。否则我就成功了!谢谢@alex-taylor.updated,需要在编解码器呼叫中添加“r”。但是,它仍然无法写入json文件,而不是在控制台中打印出来。我需要使用
r.content
,而不是
r.content
,因为
codecs.decode
需要二进制输入。否则我就成功了!谢谢@alex taylor。