我有一个大文本文件,
其中每一行都是根据一个定义语法(用正则表达式处理)。
我收到以下错误:
remainder = '{} {} '.format(*pieces[-1])
IndexError: list index out of range
关于此代码:
def open_delimited(filename, args):
with open(filename, args, encoding="UTF-16") as infile:
chunksize = 10000
remainder = ''
for chunk in iter(lambda: infile.read(chunksize), ''):
pieces = re.findall(r"(\d+)\s+(\d+_\d+)\s+(((post)\s+1)|((\d+_\d+_\d+)\s+(comment)\s+2))(.+)(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}:\d{2})(.*)", remainder + chunk, re.IGNORECASE)
for piece in pieces[:-1]:
yield piece
remainder = '{} {} '.format(*pieces[-1])
if remainder:
yield remainder
filename = 'data/AllData_2000001_3000000.txt'
for chunk in open_delimited(filename, 'r'):
for j in range(len(chunk)):
print(chunk[j])
当我限制迭代次数时,代码工作正常。
i = 0
for chunk in open_delimited(filename, 'r'):
if (i <= 1000):
for j in range(len(chunk)):
print(chunk[j])
else:
break
i += 1
答案 0 :(得分:2)
pieces
是否可以为空?
>>> [][-1]
IndexError: list index out of range
我最好的猜测是re.findall
有时候找不到任何东西。
答案 1 :(得分:2)
如果正则表达式没有在块中找到一块,它将返回一个空列表,从而返回错误。
>>> pieces = []
>>> pieces[-1]
IndexError: list index out of range
如果你希望在每个块中找到碎片,那么接下来的问题就是为什么你没有在一个特定的块中找到一块。我会继续调试如下
try:
remainder = '{} {} '.format(*pieces[-1])
except IndexError:
print pieces
print chunk
raise