2015-05-01 33 views
0

我有以下csv調用report.csv。這是一個Excel文件:IndexError:列表索引超出範圍csv reader python

email agent_id misc 
[email protected] 65483843154f35d54 blah1 
[email protected] sldd989eu99ufj9ej9e blah 2 

我有以下代碼:

import csv 

data_file = 'report.csv' 
def import_data(data_file): 
    attendee_data = csv.reader(open(data_file, 'rU'), dialect=csv.excel_tab) 
    for row in attendee_data: 
     email = row[1] 
     agent_id = row[2] 
     pdf_file_name = agent_id + '_' + email + '.pdf' 
     generate_certificate(email, agent_id, pdf_file_name) 

我收到以下錯誤:

Traceback (most recent call last): 
File "report_test.py", line 56, in <module> 
import_data(data_file) 
File "report_test.py", line 25, in import_data 
email = row[1] 
IndexError: list index out of range 

我認爲指數爲列數,內每一行。 row[1]和'行[2]`應該在範圍內,不是?

+4

您需要修復縮進。此外,列表索引從0開始。 – LukeP

+0

@LukeP對縮進感到抱歉。我知道指數從0開始。因此,如果有3個項目,不應該1和2在範圍內? – dwstein

+0

電子郵件列是行[0],您的代理ID是行[1],您的misc是行[2],看起來您只需要移動索引。 – LampPost

回答

0

你說你有一個「Excel CSV」,我不太明白,所以我會回答假設你有一個實際.csv文件。

如果我加載一個.csv到內存中(該文件是不是很大),我經常對我的類load_file方法不關心索引。

假設文件有標題行:

import csv 

def load_file(filename): 

    # Define data in case the file is empty. 
    data = [] 
    with open(filename) as csvfile: 
     reader = csv.reader(csvfile) 
     headers = next(reader) 
     data = [dict(zip(headers, row)) for row in reader] 

    return data 

這將返回,而不是指數,你可以通過使用關鍵詞典列表。在該事件中將缺少密鑰,例如從該行(索引2)缺少misc,因此從row只需要.get。這比try...except更乾淨。

for row in data: 
    email = row.get('email') 
    agent_id = row.get('agent_id') 
    misc = row.get('misc') 

這樣,文件列的順序並不重要,只有標題可以。另外,如果任何一列有空白值,您的腳本將不會通過發出IndexError而出錯。如果您不想包含空白值,只需通過檢查來處理它們:

if not email: 
    do.something() 
if not agent_id: 
    do.something_else() 
0

您的CSV文件中很可能有空行。此外,列表索引從0開始,而不是1.

import csv 

data_file = 'report.csv' 
def import_data(data_file): 
    attendee_data = csv.reader(open(data_file, 'rU'), dialect=csv.excel_tab) 
    for row in attendee_data: 
     try: 
      email = row[0] 
      agent_id = row[1] 
     except IndexError: 
      pass 
     else: 
      pdf_file_name = agent_id + '_' + email + '.pdf' 
      generate_certificate(email, agent_id, pdf_file_name) 
相關問題