2016-06-05 10 views
0

Ich habe dieses Script-Dateien von meinem slack Konto zu löschen:KeyError auf Python-Skript

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!" 

Im diesen Fehler:

File "main.py", line 28, in files = json.loads(content)["files"] KeyError: 'files'

bin ich etwas fehlt? Tks!

Antwort

0

Sie erwarten, dass json.loads() ein Diktat zurückgibt, das einen Schlüssel mit dem Namen files hat. Aber in Wirklichkeit haben die geparsten Daten diesen Schlüssel nicht.

Sie können diese stattdessen tun:

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

Auf diese Weise files entweder die eigentlichen Dateien, wie in der JSON-Nutzlast enthält. Wenn der Dateischlüssel nicht existiert, wird None zurückgegeben.

Sie können auch einen Wert an die get Methode übergeben den Standardwert gesetzt, wenn der Schlüssel nicht gefunden, wie diese:

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

diese Weise Dateien wird eine leere Liste, wenn die Dateien Schlüssel doesn sein‘ t existieren.

1

Schalter

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

Um

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

standardmäßig die get-Methode gibt None wenn das Attribut nicht existiert, während die [] Notation einen Fehler wirft, wenn das Element ‚doesn t existieren. Wenn die response.json() kein Dateiattribut hat (was hier passiert), wird es ausbrechen.

+1

Wenn der Schlüssel "files" nicht existiert, gibt die 'get'-Methode' None' zurück. Running 'len()' auf 'None' wird nicht Spaß machen;) – masnun

+0

Toller Punkt, danke! Switching bekommt stattdessen eine leere Liste zurück –

Verwandte Themen