首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析txt文件并使用openpyxl输出到xlsx文件

解析txt文件并使用openpyxl输出到xlsx文件
EN

Stack Overflow用户
提问于 2022-03-05 12:16:53
回答 2查看 33关注 0票数 0

我对python很陌生,我正试图解析来自女巫的大文本,我需要一些特定的数据输出到两个列上的xlsx文件中。

我需要解析的文本如下所示:

代码语言:javascript
复制
[memcpy.pointer_arithmetic.5] line 33 pointer relation: pointer outside object bounds in (const char *)pvItemToQueue$link1: SUCCESS

我想看起来像这样:

我在解析文本时遇到了问题,我需要在一列中使用split[0]split[1],在一列中需要split[2],我尝试过这样的方法(只是第一列的一部分):

代码语言:javascript
复制
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')

我收到以下错误:

代码语言:javascript
复制
    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行指针关系),我不明白为什么不能访问列表中的第二个和第三个元素。

使用这个简单的代码,它打印成功:

代码语言:javascript
复制
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]) 

你能告诉我有什么问题吗?

EN

回答 2

Stack Overflow用户

发布于 2022-03-05 12:40:10

您所得到的错误意味着您正在处理的数据不是您所期望的数据。换句话说,您正在处理的行中没有足够的:字符将其拆分为3个list元素。这就是抛出索引错误的原因。

正如一般的故障排除步骤一样,在抛出错误的行之前抛出一个print语句,打印错误抛出的数据。

因为我们不知道导致错误的确切数据是什么,所以我们不能直接帮助您。不过,我确实对您的代码提出了一些建议,以使其更加健壮。我从您的代码和提供的示例数据中收集到,您希望将包含[字符的每一行中的所有内容放在两个不同的列中,在最后一个:字符上拆分。试试下面的代码。

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2022-03-05 13:40:08

解决这个问题时,问题是输入文件,只有一个":“的文本行,用这个代码设法克服这个问题:

代码语言:javascript
复制
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

谢谢你的及时答复。

比尔·斯蒂芬河

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71362115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档