为了账号安全,请及时绑定邮箱和手机立即绑定

Python:如何删除重复/相似的行

Python:如何删除重复/相似的行

largeQ 2022-01-11 16:13:31
我有一个包含大量消息的文件。每一行都是一条独特的消息,其结构彼此相似,稍作修改。一个例子如下:Error number 609 at line 10Error number 609 at line 22Error string "foo" at line 11Error string "bar" at line 14并希望输出类似于:Error number 609 at line 10Error string "foo" at line 11它们是“相同”类型的错误。我设法删除了类似的行,但我遇到的问题是我必须循环遍历文件中的每一行多少次,直到它不再有“重复”。我目前拥有的:from difflib import SequenceMatcherdef similar(a, b):    return SequenceMatcher(None, a, b).ratio()lst = open("result.txt").readlines()print(len(lst))for i in lst:    for index, line in enumerate(lst):        try:            if similar(lst[index],lst[index + 1]) > 0.8:                lst.pop(index)        except:            passprint(len(lst))但这不是一个确定的方法,因为它可能是循环次数过多,或者如果文件非常大且包含许多“相同”行,则可能还不够。编辑:文件中多种消息类型之一的更准确示例是以下内容:[{TYPE}] Timeout after {miliseconds} millis, source ref: {random-number}, system: {system}, delivered {system}: , current {system}: {time}
查看完整描述

2 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

假设输入文件中的每个条目都采用以下格式...


[{TYPE}] Timeout after {miliseconds} millis, source ref: {random-number}...

lst = open("result.txt").readlines()


pretoken = "["

posttoken = "]"


foundTypes = []

log = []


for line in lst:

    foundType = ""

    for letter in line:

        if letter == pretoken: pass

        elif letter == posttoken: break

        else: foundType += letter


    if foundType not in foundTypes:

        foundTypes.append(foundType)

        log.append(line)


print(log)


查看完整回答
反对 回复 2022-01-11
?
慕仙森

TA贡献1827条经验 获得超7个赞

您只需要逐行打开并读取日志文件。


a=b=None

with open('result.txt') as infile:

    if a == None:

        a = infile.readline()

    b = infile.readline()

    while a:

        a = infile.readline()

        print('proc similar(a,b)')

        b = a


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 301 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信