IndexError:列表索引超出范围csv reader python

时间:2015-05-01 17:30:23

标签: python csv

我有以下名为report.csv的csv。这是一个excel文件:

email   agent_id    misc
test@email.com  65483843154f35d54   blah1
test1@email.com 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]和'row [2]`应该在范围内,不是吗?

2 个答案:

答案 0 :(得分:1)

您的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)

答案 1 :(得分:0)

你说你有一个&#34; Excel CSV&#34;,我不太明白,所以假设你有一个实际的.csv文件,我会回答。

如果我正在将.csv加载到内存中(并且该文件不是很大),我的课程中通常会有一个load_file方法,而不是#&# 39;关心索引。

假设文件有标题行:

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

这将返回您可以按键而不是索引使用的字典列表。密钥将在事件中缺失,例如行{index 1}中缺少misc,因此只需.get中的row。这比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()