请求-Python解析JSON错误-使用编解码器加载
我试图用python和请求解析api中的数据 参考文献 及 上面列出了多个引用,因为我已经用收到的每个错误更新了脚本请求-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
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'))
makedata
要成为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'))
makedata
要成为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。