我对python很陌生,我正试图解析来自女巫的大文本,我需要一些特定的数据输出到两个列上的xlsx文件中。
我需要解析的文本如下所示:
[memcpy.pointer_arithmetic.5] line 33 pointer relation: pointer outside object bounds in (const char *)pvItemToQueue$link1: SUCCESS我想看起来像这样:

我在解析文本时遇到了问题,我需要在一列中使用split[0]和split[1],在一列中需要split[2],我尝试过这样的方法(只是第一列的一部分):
from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet("Queue", 0)
ws2 = wb.create_sheet("Task", 1)
with open('CBMC_Queue_Results.txt', 'r') as input:
list1 = [line for line in input]
ws = wb['Queue']
ws["A1"] = "Tests"
row = 2
column = 1
for line in list1:
if not "[" in line:
continue
split = line.split(':')
ws.cell(row=row, column=column).value = split[0] + split[1]
row += 1
wb.save('All_Results.xlsx')我收到以下错误:
ws.cell(row=row, column=column).value = split[0] + split[1]
IndexError: list index out of range如果我只是离开split[0],它就能工作,并将xlsx文件放在列表的第一部分(例如,memcpy.pointer_arithmetic.5第33行指针关系),我不明白为什么不能访问列表中的第二个和第三个元素。
使用这个简单的代码,它打印成功:
text = '''[memcpy.pointer_arithmetic.5] line 33 pointer relation: pointer outside object bounds in (const char *)pvItemToQueue$link1: SUCCESS'''
split = text.split(':')
print(split[2]) 你能告诉我有什么问题吗?
发布于 2022-03-05 12:40:10
您所得到的错误意味着您正在处理的数据不是您所期望的数据。换句话说,您正在处理的行中没有足够的:字符将其拆分为3个list元素。这就是抛出索引错误的原因。
正如一般的故障排除步骤一样,在抛出错误的行之前抛出一个print语句,打印错误抛出的数据。
因为我们不知道导致错误的确切数据是什么,所以我们不能直接帮助您。不过,我确实对您的代码提出了一些建议,以使其更加健壮。我从您的代码和提供的示例数据中收集到,您希望将包含[字符的每一行中的所有内容放在两个不同的列中,在最后一个:字符上拆分。试试下面的代码。
testdata = '''[memcpy.pointer_arithmetic.5] line 33 pointer relation: pointer outside object bounds in (const char *)pvItemToQueue$link1: SUCCESS
[memcpy.pointer_arithmetic.5] line 33 pointer relation: pointer outside object bounds in (const char *)pvItemToQueue$link1: SUCCESS'''
for line in testdata.split("\n"):
if not "[" in line:
continue
columndata = ":".join(line.split(':')[:-1]) # now it doesn't matter how many : characters there are
success = line.split(":")[-1].strip() # clean spaces
print(columndata)
print(success)发布于 2022-03-05 13:40:08
解决这个问题时,问题是输入文件,只有一个":“的文本行,用这个代码设法克服这个问题:
if line.startswith("["):
splitline = line.split(':')
del splitline[-1]
try:
ws.cell(row=row, column=columnA).value = splitline[0] + ":" + splitline[1]
except:
ws.cell(row=row, column=columnA).value = splitline[0]
ws.column_dimensions['A'].width = 150
ws.cell(row=row, column=columnB).value = line.split(":")[-1]
row += 1谢谢你的及时答复。
比尔·斯蒂芬河
https://stackoverflow.com/questions/71362115
复制相似问题