2016-10-17 6 views
0

Ich lösche Phantom-Dateien, die wir in Slack haben. Unten ist mein Skript. Ich erhalte einen IndexError-Listenindex außerhalb des Bereichsfehlers. Kann mir jemand helfen, was ich falsch mache?IndexError falscher Fehler Python

import Slacker 
import sys 
import time 
from datetime import timedelta, datetime 


def main(token, weeks=4): 
    slack = Slacker(token) 
    total = slack.files.list(count=1).body['paging']['total'] 
    num_pages = int(total/1000.00 + 1) 
    print("{} files to be processed, across {} pages".format(total, num_pages)) 
    files_to_delete = [] 
    ids = [] 
    count = 1 
    for page in range(num_pages): 
     print ("Pulling page number {}".format(page + 1)) 
     files = slack.files.list(count=1000, page=page+1).body['files'] 
     for file in files: 
      print("Checking file number {}".format(count)) 
      if file['id'] not in ids: 
       ids.append(file['id']) 
       if datetime.fromtimestamp(file['timestamp']) < datetime.now() - timedelta(weeks=weeks): 
        files_to_delete.append(file) 
        print("File No. {} will be deleted".format(count)) 
       else: 
        print ("File No. {} will not be deleted".format(count)) 
      count+=1 

    print("All files checked\nProceeding to delete files") 
    print("{} files will be deleted!".format(len(files_to_delete))) 
    count = 1 
    for file in files_to_delete: 
     print("Deleting file {} of {}".format(count, len(files_to_delete))) 
     slack.files.delete(file_=file['id']) 
     print("Deleted Successfully") 
     count+=1 

    return count-1 

if __name__ == "__main__": 
    try: 
     token = sys.argv[1:] 
    except IndexError: 
     print("Usage: python file_deleter.py api_token\nPlease provide a value for the API Token") 
     sys.exit(2) 

    main(token[0]) 

Es gibt einen Fehler auf der letzten Zeile Haupt (Token [0]).

Traceback (most recent call last): 
    File "C:/Users/aqureshi/Desktop/Programming/Slacker.py", line 50, in <module> 
    main(token[0]) 
IndexError: list index out of range 
+0

und wie führen Sie das Programm aus? Ich nehme an, dass Sie einige Argumente weitergeben? –

+1

Sie sollten sagen, wie Sie die Datei ausführen .... 'sys.argv [1:]' bedeutet, es erwartet Befehlszeilenargumente –

+0

Dieses Skript wurde mir von einem leitenden Entwickler weitergeleitet. Ich dachte, es sollte funktionieren, aber ich weiß, dass mir hier Elemente fehlen. Wenn Sie diese Elemente hervorheben können, würde ich es begrüßen. –

Antwort

0

Sie könnten den Fehler zu beheben, wie so, aber das wird Ihnen sagen, wie Sie tatsächlich benötigen, um diese Datei ausgeführt werden.

Mit anderen Worten, Bitte geben Sie einen Wert für die API-Token

if __name__ == "__main__": 
    try: 
     token = sys.argv[1:] 
     main(token[0]) 
    except IndexError: 
     print("Usage: python file_deleter.py api_token\nPlease provide a value for the API Token") 
     sys.exit(2) 

So etwas wie Desktop\> python Slacker.py xxxxAPI_TOKENxxxx

Ich könnte versuchen, dass-außer neu schreiben, um tatsächlich die Länge der Argumente zu validieren, obwohl

if __name__ == "__main__": 
    if len(sys.argv) != 2: 
     print("Usage: python file_deleter.py api_token\nPlease provide a value for the API Token") 
     sys.exit(2) 

    token = sys.argv[1:] 
    main(token[0]) 
+0

Danke Cricket_007 lassen Sie mich sehen, wie weit ich damit komme. Ich bin neu bei Python und lerne dank freundlicher Entwickler wie euch. Vielen Dank!!!!! –

0

Erwartung dieses

token = sys.argv[1:] 

Das Auslösen einer Ausnahme ist fehlerhaft. Es wird nie, es wird nur gehen auf eine leere Liste zurück, wenn sys.argv sich nur die Länge 1. Dann ist

main(token[0]) 

Ist Ihr IndexError

Statt die Länge Ihrer sys.argv Variablen überprüfen. Es sollte mindestens 2 sein, damit 1 oder mehr Argumente vorhanden sind.

import sys 

def main(x): 
    print(x) 

if __name__ == "__main__": 

    if len(sys.argv) < 2: 
     print("Usage: python file_deleter.py api_token\nPlease provide a value for the API Token") 
     sys.exit(2) 

    main(sys.argv[1]) 
+0

Zu viele Parameter sind auch schlecht. Besser auf 2 explizit prüfen. – tdelaney

1

Nominell könnten Sie das Problem beheben, indem Sie main(token[0]) in den try/except-Block verschieben. Aber das ist problematisch, weil jedes andere IndexError im Programm fälschlicherweise als ein Befehl-Verwendung-Problem gemeldet werden könnte. Besser, den Eingabeparameter explizit zu überprüfen. Es gibt Ihnen auch die Möglichkeit, gegen allgemeine Hilfe-Flags zu überprüfen.

if __name__ == "__main__": 
    if len(sys.argv) != 2 or sys.argv[1] in ('-h', '--help', '/?'): 
     print("Usage: python file_deleter.py api_token\nPlease provide a value for the API Token") 
     sys.exit(2) 
    main(sys.argv[1]) 
Verwandte Themen