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

问题描述:

我想解析与python和请求的API的数据。请求 - Python解析JSON错误 - 加载与编解码器

SO参考如上我已经更新脚本与每个错误地接收 Python codecsutf-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) 
+1

是否有你需要使用'r.json()'理由吗?为什么不直接将'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) 
+0

已更新,需要在编解码器调用中添加'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)