Python中的索引越界
我正在尝试对一个Excel文件进行索引,我使用了whoosh这个包,但我遇到了一个错误,提示列表索引超出范围。
请问有没有人能帮我?
我的代码是:
from whoosh import fields, index
import os.path
import csv
import codecs
# This list associates a name with each position in a row
columns = ["juza","chapter","verse","analysis"]
schema = fields.Schema(juza=fields.NUMERIC,
chapter=fields.NUMERIC,
verse=fields.NUMERIC,
analysis=fields.KEYWORD)
# Create the Whoosh index
indexname = "index"
if not os.path.exists(indexname):
os.mkdir(indexname)
ix = index.create_in(indexname, schema)
# Open a writer for the index
with ix.writer() as writer:
# Open the CSV file
with codecs.open("yom.csv", "rb","utf8") as csvfile:
# Create a csv reader object for the file
csvreader = csv.reader(csvfile)
# Read each row in the file
for row in csvreader:
# Create a dictionary to hold the document values for this row
doc = {}
# Read the values for the row enumerated like
# (0, "juza"), (1, "chapter"), etc.
for colnum, value in enumerate(row):
# Get the field name from the "columns" list
fieldname = columns[colnum]
# Strip any whitespace and convert to unicode
# NOTE: you need to pass the right encoding here!
value = unicode(value.strip(), "utf-8")
# Put the value in the dictionary
doc[fieldname] = value
# Pass the dictionary to the add_document method
writer.add_document(**doc)
writer.commit()
`
然后我得到了这个错误,我不知道为什么?
错误信息:
Traceback (most recent call last):
File "C:\Python27\yarab.py", line 39, in <module>
fieldname = columns[colnum]
IndexError: list index out of range
还有我的csv文件:
1 3 1 Al+ POS:ADJ LEM:r~aHoma`n ROOT:rHm MS GEN
1 3 2 Al+ POS:ADJ LEM:r~aHiym ROOT:rHm MS GEN
1 4 1 POS:N ACT PCPL LEM:ma`lik ROOT:mlk M GEN
1 4 2 POS:N LEM:yawom ROOT:ywm M GEN
1 4 3 Al+ POS:N LEM:diyn ROOT:dyn M GEN
1 5 1 POS:PRON LEM:<iy~aA 2MS
1 个回答
0
csv.reader
默认使用逗号 ,
作为分隔符。
你需要明确指定你的分隔符:
csvreader = csv.reader(csvfile, delimiter=...)
不过,你的CSV文件可能格式不统一。直接用其他方法读取会更好,而不是用 csv
:
columns = ["juza","chapter","verse","analysis"]
with codecs.open("yom.csv", "rb","utf8") as f:
for line in f:
a, b, c, rest = line.split(' ', 3)
doc = {k:v.strip() for k,v in zip(columns, rest.split(':'))}
# a,b,c are the first three integers
# doc is a dictionary