查找,打印和删除除重复的PYTHON之外的所有行

时间:2014-02-19 18:07:25

标签: python extract repeat lines

我有一个大文本文件,其中的行看起来像:

data123||data456
data146||data269
data123||data456
data697||data983
data123||data456

我想在上面的例子中找到重复的行,例如data123 || data456,打印这些行,然后删除文件中除行的一个副本。我希望能够提取完全相同的LINES。

到目前为止,我有以下代码,但它似乎打印所有重复的“数据###”,如果碰巧出现不止一次,无论其他'数据###'是否配对用它。换句话说,我想提取逐字重复的整个LINES,而不仅仅是单独的'data ####'。

with open("file.txt") as f:
    seen = set ()
    for line in f:
            line_lower =line.lower()
            if line_lower in seen:
                print (line)
            else:
                seen.add(line_lower)

3 个答案:

答案 0 :(得分:0)

试试这个:

  1. 获取文件行

    lines = open("file.txt").readlines()
    
  2. 根据这些行获取一组。副本不包含在集合

    ulines = set(lines)
    
  3. 对于集合中的每一行,我们从原始列表中删除该行的一个实例

    for line in ulines:
        #we know the line will exist in the list, because it exists in the set
        lines.remove(line)
    
  4. 最后,该集合包含非重复项,并且该列表包含重复(由集合非迭代)实例。我们可以通过

    获得“哪些行被复制”
    duplicated = set(lines)
    
    print duplicated
    print ulines
    
  5. 参见http://docs.python.org/2/tutorial/datastructures.html<< list.remove(x)和“5.4 sets”

答案 1 :(得分:0)

如果您的文件不是很大,这是一个简单的方法:

lines = [line.lower() for line in open("file.txt")]
unique = set(lines)
duplicates = set([line for line in unique if lines.count(line) > 1])

duplicates将包含每个unique值的单个实例,该值在文件中出现多次。

答案 2 :(得分:-1)

你的if语句被颠倒了。你只想打印以前没见过的线条,对吧?所以不应该是

with open("file.txt") as f:
    seen = set ()
    for line in f:
        line_lower = line.lower()
        if line_lower not in seen:
            print (line)
            seen.add(line_lower)