需要帮助删除txt文件中的重复行

时间:2019-04-19 16:07:00

标签: python duplicates

我需要打印输出,其中仅拆分1个列表且不重复。我正在使用的列表有100k电子邮件和1000x重复。我要删除那些..

我尝试了一些我在网上看过的东西

但是我的新文件中什么都没有写,并且pycharm在运行时冻结了

def uniquelines(lineslist):
    unique = {}
    result = []
    for item in lineslist:
        if item.strip() in unique: continue
            unique[item.strip()] = 1
            result.append(item)
    return result

file1 = open("wordlist.txt","r")
filelines = file1.readlines()
file1.close()

output = open("wordlist_unique.txt","w")
output.writelines(uniquelines(filelines))
output.close()

我希望它只打印所有电子邮件,而不会重复到新的文本文件中

1 个答案:

答案 0 :(得分:1)

在我找到希望解决该问题的几种方法之前,我发现最主要的一件事是您在函数中同时使用了字典和列表。这几乎使处理事情所需的内存增加了一倍。我建议使用其中一个。

使用set将为您提供唯一项目的保证“列表”。 set.add()函数将忽略重复项。

s = {1, 2, 3}
print(s) #{1, 2, 3}
s.add(4)
print(s) #{1, 2, 3, 4}
s.add(4)
print(s) #{1, 2, 3, 4}

这样,您可以将函数修改为以下内容,以实现所需的功能。在我的示例中,我将input.txt作为一系列行,仅包含一个整数值和大量重复项。

def uniquelines(lineslist):
    unique = set()

    for line in lineslist:
        unique.add(str(line).strip())

    return list(unique)

with open('input.txt', 'r') as f:
    lines = f.readlines()

output = uniquelines(lines)

with open('output.txt', 'w') as f:
    f.write("\n".join([i for i in output]))

output.txt如下,没有重复!

2
0
4
5
3
1
9
6

您可以通过在列表理解中调用set()来完成相同的操作,但是这里的缺点是您需要先将所有记录加载到内存中,然后再取出重复记录。上面的方法将保留所有唯一值,但不包含重复值,因此您可能要使用该函数。

with open('input.txt', 'r') as f:
    lines = f.readlines()

output = set([l.strip() for l in lines])

with open('output.txt', 'w') as f:
    f.write("\n".join([i for i in output]))

我不太清楚您是否希望保持每个唯一行出现次数的连续计数。如果您要这样做,则可以使用in运算符查看它是否已经在键中。

def uniquelines(lineslist):
    unique = {}

    for line in lineslist:
        line = line.strip()

        if line in unique:
            unique[line] += 1
        else:
            unique[line] = 1

    return unique

# {'9': 2, '0': 3, '4': 3, '1': 1, '3': 4, '2': 1, '6': 3, '5': 1}