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

时间:2019-04-16 06:53:07

标签: python algorithm sorting duplicates similarity

我有一个包含很多消息的文件。每行都有一条唯一的消息,该消息的结构将彼此相似,并稍加修改。一个示例如下:

library(tidyverse)
test %>%
    group_by(A, B, C) %>% 
    mutate(rn = row_number()) %>% 
    spread(sp, tl) %>%
    select(-rn)
# A tibble: 7 x 5
# Groups:   A, B, C [9]
#  A     B     C        au    cr
#  <fct> <fct> <fct> <dbl> <dbl>
#1 30    x     g        NA    29
#2 32    y     g        NA    36
#3 32    y     g        NA    44
#4 32    y     g        NA    40
#5 35    z     g        48    NA
#6 35    z     g        54    NA
#7 35    z     g        53    NA

,并希望输出为:

Error number 609 at line 10
Error number 609 at line 22
Error string "foo" at line 11
Error string "bar" at line 14

它们是错误的“相同”类型。

我设法删除了相似的行,但是我遇到的问题是我必须循环遍历文件中的每一行,直到没有更多的“重复项”为止。

我目前拥有的东西:

Error number 609 at line 10
Error string "foo" at line 11

但这不是一种确定的方法,因为它可能会浪费时间,或者如果文件很大且带有许多“相同”行,则可能不够用。

编辑:

文件中多种消息中的一种的更准确的例子是:

from difflib import SequenceMatcher

def 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:
            pass

print(len(lst))

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

[{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)