我有以下名为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]`应该在范围内,不是吗?
答案 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()