2017-06-01 9 views
-2

私はライン上で47 print_data(データのエラー「範囲外の文字列インデックス」と別のエラーを取得し続ける理由を私は知らない。誰か理由を説明していただけますか?あなたの私のコードに誤りがありますか?文字列インデックスが範囲外ですか?

def open_file(): 
    user_input = input('Enter a file name: ') 
    try: 
    file = open(user_input, 'r') 
    return file 
    except FileNotFoundError: 
    return open_file() 


def read_data(file): 
    counter = [0 for _ in range(9)] 
    for line in file.readlines(): 
    num = line.strip() 
    if num.isdigit(): 
     i = 0 
     digit = int(num[i]) 
     while digit == 0 and i < len(num): 
     i += 1 
     digit = int(num[i]) 
     if digit != 0: 
     counter[digit - 1] += 1 
    return counter 


def print_data(data): 
    benford = [30.1, 17.6, 12.5, 9.7, 7.9, 6.7, 5.8, 4.1, 4.6] 
    header_str = "{:5s} {:7s}{:8s}" 
    data_str = "{:d}:{:6.1f}% ({:4.1f}%)" 
    total_count = sum(data) 
    print(header_str.format("Digit", "Percent", "Benford")) 
    for index, count in enumerate(data): 
    digit = index + 1 
    percent = 100 * count/total_count 
    print(data_str.format(digit, percent, benford[index])) 


def main(): 
    file = open_file() 
    data = read_data(file) 
    print_data(data) 
    file.close() 

if __name__ == "__main__": 
    main() 

ありがとうございました。これは、正確なエラーですあなたの場合は

while digit == 0 and i < len(num): i += 1 digit = int(num[i])

:私は、私はエラーがこれに由来信じる

Traceback (most recent call last): 
    File "./lab08.py", line 52, in <module> 
    main() 
    File "./lab08.py", line 47, in main 
    data = read_data(file) 
    File "./lab08.py", line 26, in read_data 
    digit = int(num[i]) 
+1

。 – user2357112

+0

ファイルにサンプル行を付けることはできますか? – Rosh

+0

エラーを再現できません:問題を引き起こすのに十分な入力ファイルが必要です。 – Prune

答えて

2

を与えられていますWAP第二の2行は、あなたが適切にインデックス意志、すなわち:

while digit == 0 and i < len(num): digit = int(num[i]) i += 1

例えば、あなたの文字列numは、長さ10である、場合、最後の要素は、インデックス9(0からインデックス)です。そのループの最初の反復では、数字はnum[1]、10番目の反復ではnum[10]になります。

別の方法は次のようにリストの内包表記を使用することです:あなたは、エラーメッセージの一部を切断し for n in num: if digit != 0: break digit = int(n)

関連する問題