我正在使用CSV文件,这是我到目前为止所拥有的。我得到一个错误,我的索引超出了范围。它完成了第一个for循环然后搞砸了。我正在尝试填写字典。
def read_table(file):
line = file.readline()
line = line.strip()
keylist = line.split(',')
d = {}
for key in keylist:
if key not in d:
d[key] = []
while line != '':
line = file.readline()
line = line.strip()
val = line.split(',')
for i in keylist:
index = keylist.index(i)
d[keylist[index]].append(val[index])
return d
答案 0 :(得分:2)
while
循环在line
变空时不会中断,它只是在每个循环开始时检查它。
所以,当你读完除最后一行以外的所有内容时,你会这样做:
while line != '': # the last line wasn't empty
line = file.readline() # but now this one is
line = line.strip()
val = line.split(',') # so this returns a single value
for i in keylist:
index = keylist.index(i) # so this raises an IndexError
d[keylist[index]].append(val[index])
最小修复是在每个readline
之后直接进行检查:
while True:
line = file.readline()
line = line.strip()
if not line:
break
val = line.split(',') # so this returns a single value
for i in keylist:
index = keylist.index(i) # so this raises an IndexError
d[keylist[index]].append(val[index])
(请注意,如果文件中间有空行,您将提前返回而不是引发错误,因为您在line
之后检查line = line.strip()
,所以您不能更长时间区分空行'\n'
和文件结束''
。如果这是一个问题,只需将测试向上移动一行。)
更好的修复方法是迭代文件:for line in file:
完全按照您希望循环执行的操作,而不必处理readline
并检查空字符串和break
来自循环等等。
但更好的修复方法是使用csv
模块让它做它的工作:
d = defaultdict(list)
reader = csv.DictReader(file)
for line in reader:
for key, value in line.items():
d[key].append(value)
return d
或者,或者,只需构建一个dicts列表(您可以使用list_o_dicts = list(reader)
),然后将其转换为最后列表的dict。