我正在尝试使用 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)