python脚本的KeyError

时间:2016-06-05 14:10:41

标签: python json api

我有这个脚本从我的松散帐户中删除文件:

import requests
import json
import calendar
import re
from datetime import datetime, timedelta

_token = re.escape("token")
_domain = re.escape("domain")

if __name__ == '__main__':
    while 1:
        files_list_url = 'https://slack.com/api/files.list'
        date = str(calendar.timegm((datetime.now() + timedelta(-30))
            .utctimetuple()))
        data = {"token": _token, "ts_to": date}
        response = requests.post(files_list_url, data = data)

        if len(response.json()["files"]) == 0:
            break
        for f in response.json()["files"]:
            print "Deleting file " + f["name"] + "..."
            timestamp = str(calendar.timegm(datetime.now().utctimetuple()))
            delete_url = "https://" + _domain + ".slack.com/api/files.delete?t=" + timestamp
            requests.post(delete_url, data = {
                "token": _token, 
                "file": f["id"], 
                "set_active": "true", 
                "_attempts": "1"})
    print "DONE!"

我收到此错误:

  

文件“main.py”,第28行,in       files = json.loads(content)[“files”] KeyError:'files'

我错过了什么吗? TKS!

2 个答案:

答案 0 :(得分:1)

切换

if len(response.json()["files"]) == 0:

if len(response.json().get("files", [])) == 0:

默认情况下,如果属性不存在,则get方法返回None,而如果项目不存在,则[]符号会引发错误。如果response.json()没有文件属性(这就是这里发生的事情),那么它就会爆发。

答案 1 :(得分:0)

您期望json.loads()将返回一个名为files的密钥的字典。但实际上,解析后的数据没有该密钥。

你可以改为:

payload = json.loads(content)
files = payload.get('files')

这种方式files将包含JSON有效内容中的实际文件。如果文件密钥不存在,则返回None

您还可以将值传递给get方法,以便在找不到密钥时设置默认值,如下所示:

files = payload.get('files', [])

这样,如果文件密钥不存在,文件将是一个空列表。