2016-02-06 154 views
2

我有我從事Python工作的示例文本。Python - 索引超出範圍錯誤

Afghanistan:32738376 
    Akrotiri:15700 
    Albania:3619778 
    Algeria:33769669 
    American Samoa:57496 
    Andorra:72413 
    Angola:12531357 
    Anguilla:14108 
    Antigua and Barbuda:69842 
    Argentina:40677348 
    Armenia:2968586 
    Aruba:101541 
    Australia:20600856 
    Austria:8205533 
    Azerbaijan:8177717 

我有這段代碼來製作一個字典,使用國家名稱和人口。

dct = {} 
    for line in infile: 
    line = line.strip() 
    words = line.split(":") 
    countryname = words[0] 

    population = int(words[1]) 
    dct[countryname] = population 

當我打印人口,它打印的所有值,但是然後我得到一個人口= INT(字[1]) - IndexError:列表索引超出範圍。我不明白我是如何得到這個錯誤,特別是當我打印countryname時,它是絕對好的,錯誤只發生在人口中。 Python必須爲這兩個變量訪問相同數量的行,但它似乎與人口一樣嘗試訪問更多行,這是我不明白的,因爲它不會爲countryname這樣做。任何想法,爲什麼發生這種情況。

+4

您可能有一個空行或多個分隔符不會生成第二個項目。嘗試打印每行(或使用調試器查看),然後修復代碼以適應違規行。您可以檢查分割前是否存在':',如果不跳過該行。類似的東西 – Eran

+0

無法重現。 – Idos

回答

1

你認爲你的文件是完美的,這是錯誤的。

try: 
    countryname = words[0] 
    population = int(words[1]) 
    dct[countryname] = population 
except IndexError: 
    print("Impossible convert line: %s " % line) 

我更喜歡在這種情況下使用日誌而不是打印語句,但爲了示例的緣故,我認爲沒關係。 如果需要,還應該打印行號。

無論如何,try/except的目的是爲了避免在文件不考慮你想要的格式時破壞程序。

1

可能有沒有分隔符的線:。嘗試捕獲它

dct = {} 
    for line in infile: 
    line = line.strip() 
    words = line.split(":") 
    countryname = words[0] 

    population = 0 
    if words.__len__() > 1: 
     population = int(words[1]) 

    dct[countryname] = population 
+0

不要使用單詞.__ len __()但len(單詞) – Eran

0

請檢查您的文件內容,看起來像某個文件中的「:」是國名和人口之間的丟失:

rfile = open('a.txt', 'rw') 
print dict([line.strip().split(':')for line in rfile.readlines()]) 
0

我建議你添加以下診斷到你的代碼:

dct = {} 
for line_number, line in enumerate(infile): 
    line = line.strip() 
    words = line.split(":") 

    if len(words) != 2: 
     print "Line {} is not correctly formatted - {}".format(line_number, line) 
    else: 
     countryname = words[0] 
     population = int(words[1]) 
     dct[countryname] = population 

那麼這將顯示哪些數據中的行號格式問題,它會顯示類似:

Line 123 is not correctly formatted - Germany8205534 
Line 1234 is not correctly formatted - Hungary8205535