请求 - Python解析JSON错误 - 加载与编解码器
我想解析与python和请求的API的数据。请求 - Python解析JSON错误 - 加载与编解码器
SO参考如上我已经更新脚本与每个错误地接收 Python codecs和utf-8 bom error
列出了多个引用。
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 https://api.tatts.com/sales/vmax/web/data/racing/2017/4/05/mr/响应保存到file.json
起初,我收到了来自SO参考答案下面这样应用的编解码器的分辨率。
json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)
这个决议从SO回答。
data = json.load(codecs.open(r.json(), 'utf-8-sig'))
现在我收到错误
TypeError: expected str, bytes or os.PathLike object, not dict
但是我无法解决typerror因为我需要使用的编解码器停止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
打开使用给定的编码中的本地文件。 codecs.decode
将转换内存中的对象。所以,我认为你是后:
data = json.load(codecs.decode(r.text, 'utf-8-sig'))
请注意,我用r.text
这意味着请求库不会尝试做任何自己的解析。除非您想在保存前修改数据,否则您可以直接将响应保存到磁盘:
with open('data.json', 'w') as f:
f.write(r.text)
已更新,需要在编解码器调用中添加'r'。但是它仍然无法写入json文件,而是在控制台中打印出来。 – sayth
回答您的更新问题。你没有达到写入数据的代码文件,如果您向上滚动您的输出我相信你得到的错误是:
IOError: [Errno 63] File name too long:...
的codecs.open(r.text, 'r', 'utf-8-sig')
第一个参数是filename
,你可以找出以下docs of codecs.open
。我认为亚历克斯·泰勒的回答是足以写入响应文件,但 如果你真的需要响应解码,你可以尝试:
data = codecs.decode(str(response.text), 'utf-8-sig')
代码中的另一个错误:data = json.load(codecs.open(r.text, 'r', 'utf-8-sig'))
使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'写入文件? –