2016-10-17 5 views
0

Slackにあるファントムファイルを削除します。以下は私のスクリプトです。 IndexErrorリストのインデックスが範囲外のエラーになっています。誰かが私が間違っていることを助けてくれますか?IndexError wrong error 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]) 

最終行のメイン(トークン[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

どのようにプログラムを実行しますか?私はいくつかの議論を通過していると思いますか? –

+1

ファイルをどのように実行しているかを言うべきです.... 'sys.argv [1:]'はコマンドライン引数を期待しています。 –

+0

このスクリプトは上級開発者から私に転送されています。私はそれが動作するはずだと思ったが、私はここに要素がないことを知っている。あなたがそれらの要素を強調することができれば、私はそれを感謝します。 –

答えて

0

このようにエラーを解決できますが、実際にこのファイルをどのように実行する必要があるかを教えてくれるでしょう。

つまり

APIに値を入力してくださいトークン

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) 

私はそれがしよう-除いて、実際の引数の長さを検証するために再書き込み可能性があるDesktop\> python Slacker.py xxxxAPI_TOKENxxxx

ような何か、

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

ありがとうございます。Cricket_007これでどれくらい手に入るか教えてください。私はあなたのような親切な開発者のおかげで、Pythonには新しく、学習しています。ありがとう!!!!! –

0

はこの

を期待しても210
token = sys.argv[1:] 

例外をスローするのは誤りです。それは、それだけでsys.argv自体はその後

main(token[0]) 

は、代わりにあなたのsys.argv変数の長さを確認し、あなたのIndexError

される唯一の長さ1である場合は、空のリストを返すために行くんだろうだろう決して。 1つ以上の引数が存在するためには少なくとも2でなければなりません。

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

パラメータが多すぎると悪いです。明示的に2を確認する方が良いでしょう。 – tdelaney

1

名目上、あなたはtry/exceptブロック内main(token[0])を移動することによって、問題を解決することができます。しかし、それは問題があります。なぜなら、プログラム内の他のいずれかのIndexErrorが誤ってコマンド使用上の問題として報告される可能性があるからです。入力パラメータを明示的にチェックする方が良い。また、共通のヘルプフラグをチェックする機会も与えます。

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])