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



我正在尝试使用 python 和请求从 api 解析数据。

所以参考Python 编解码器和 utf-8 bom 错误

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

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

但是我无法解析打字器,因为我需要使用编解码器加载以停止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)

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

IOError: [errno 63] 文件名太长:...

codecs.open(r.text, 'r', 'utf-8-sig')的第一个参数是 filename ,您可以在以下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)

相关内容

最新更新