2017-04-06 124 views
0

我想解析與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'寫入文件? –

回答

2

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

1

回答您的更新問題。你沒有達到寫入數據的代碼文件,如果您向上滾動您的輸出我相信你得到的錯誤是:

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)