使用python删除文本文件中的重复行(以及包含特定字符串的某些行)的最快方法是什么?

时间:2010-10-22 11:57:23

标签: python file

txt约为22,000行,约为3.5MB。它中有很多重复的行。我只是想删除重复的行以及一些包含不需要的特定字符串的行。

我的方法是使用readlines()方法将文件读入大列表,然后使用read()方法将文件作为大字符串读取。迭代列表,计算出现次数,用“”(空字符串)替换该行。我花了10分钟才完成这份工作?!

有没有快速的方法来做到这一点?

非常感谢!

3 个答案:

答案 0 :(得分:3)

list(set(line for line in file.readlines()
         if 'badstring' not in line
         and 'garbage' not in line))

此外,正则表达式可能比多个not in测试更快。

答案 1 :(得分:3)

我几乎总是使用生成器进行文件处理。这使代码快速,易于修改,并且易于测试。

首先,构建一个删除重复项的生成器:

def remove_duplicates(seq):
    found = set()
    for item in seq:
        if item in found:
            continue
        found.add(item)
        yield item

有效吗?

>>> print "\n".join(remove_duplicates(["aa", "bb", "cc", "aa"]))
aa
bb
cc

显然是这样。接下来,创建一个函数,告诉您行是否正常:

def is_line_ok(line):
    if "bad text1" in line:
        return False
    if "bad text2" in line:
        return False
    return True

这有用吗?

>>> is_line_ok("this line contains bad text2.")
False
>>> is_line_ok("this line's ok.")
True
>>> 

现在我们可以将remove_duplicatesitertools.ifilter与我们的函数一起使用:

>>> seq = ["OK", "bad text2", "OK", "Also OK"]
>>> print "\n".join(remove_duplicates(ifilter(is_line_ok, seq)))
OK
Also OK

此方法适用于任何返回字符串的迭代,包括文件:

with open(input_file, 'r') as f_in:
    with open(output_file, 'w') as f_out:
       f_out.writelines(remove_duplicates(ifilter(is_line_ok, f_in)))

答案 2 :(得分:0)

goodLines = set()
badString = 'bad string'

with open(inFilename, 'r') as f:
    for line in f:
        if badString not in line:
            goodLines.add(line)

# and let's output these lines (sorted, unique) in another file...

with open(outFilename, 'w') as f:
    f.writelines(sorted(goodLines))
相关问题