2016-09-06 60 views
1

這裏是我的代碼(即提高問題的部分)的部分:卡住:不能制定出錯誤 - 索引錯誤的Python 3.5

with open('list.txt') as csvfile: 
    readCSV = csv.reader(csvfile, delimiter = ",") 
    GTINs = [] 
    products = [] 
    prices = [] 
    for row in readCSV: 
     GTIN = int(row[0]) 
     product = row[1] 
     price = float(row[2]) 

     GTINs.append(GTIN) 
     products.append(product) 
     prices.append(price) 

在此行中:

GTIN = int(row[0]) 

我不斷收到錯誤「IndexError:列表索引超出範圍」,我不知道如何解決它。這裏是我試圖提取的信息(.txt文件):

69696961,Milk,1.29 
55555555,Bread,0.49 
45632549,Milkshake,1.99 

時,我的改變的程序發生錯誤(帶走了兩行)。

任何幫助將不勝感激,因爲我很好,真的卡住了。

+7

CSV中的一行是空的。 –

+0

許多csv編寫者寫入最後一行爲空但存在的文件(倒數第二行包含換行符)。這意味着EOF沒有達到,並且在@DanielRoseman說的末尾有一條空白線。在for循環之下,你可以在執行追加之前添加一個'if row.rstrip():' –

+0

並且一個快速解決方法是在'for'的頂部放置'if not row:continue' ... –

回答

0

嘗試從list.txt文件中刪除空行。

0

看來你的csv中有不正確的或黑線。您可以使用try-except表達式來處理索引錯誤。

try: 
    GTIN = int(row[0]) 
    product = row[1] 
    price = float(row[2]) 

    GTINs.append(GTIN) 
    products.append(product) 
    prices.append(price) 
except IndexError: 
    # do something (like "pass" if you don't want that lines) 

但是,如果你要提取列,您可以使用itertools.zip_longest()

from itertools import zip_longest 
with open('list.txt') as csvfile: 
    readCSV = csv.reader(csvfile, delimiter = ",") 
    GTIN, product, price = zip_longest(*readCSV, fillvalue="") 

注意:您可以用別的來代替遺漏值的空字符串。或者,如果您不將它傳遞給該函數,它將使用默認值None

正如評論,如果你想在自己的真實類型的項目,你可以用下面的辦法,其使用生成器表達式中提到:

from itertools import zip_longest 
with open('list.txt') as csvfile: 
    readCSV = csv.reader(csvfile, delimiter = ",") 
    rows = ((int(a), b, float(c)) for a, b, c in csv.reader(csvfile)) 
    GTIN, product, price = zip_longest(*rows, fillvalue="") 
+0

您錯過了'splat'那裏... –

+0

@NinjaPuppy那是什麼? – Kasramvd

+0

你的最後一行應該是'izip(* readCSV,fillvalue ='')' –

0

什麼,我在這裏看到的是一個txt文件中未CSV。下面是一個簡單的解決方案:

GTINs = [] 
products = [] 
prices = [] 
with open('stack.txt','r') as f: 
    for line in f: 
     sentence = line.split(',') 
     GTINs.append(sentence[0]) 
     products.append(sentence[1]) 
     prices.append(sentence[2]) 
print(GTINs) 
print(products) 
print(prices) 

的輸出是: [ '69696961', '55555555', '45632549'] [ '牛奶', '麪包', '奶昔'] ['1.29 \ n','0.49 \ n','1.99']