在文件中打印不匹配(唯一)行

时间:2014-11-27 11:30:04

标签: python file for-loop textmatching

我试图创建一个打开文件(filename)的函数,打印出与前一行不同的文本的每一行(始终写入第一行)。每个输出行都应在输入文件中以其行号作为前缀。

我已经提出以下内容,无论是否为重复行,都会始终打印文本的最后一行:

def squeeze(filename):
    file = open(filename, 'r')
    prevline = ''
    line_num = 0
    for line in file:
        line_num = line_num + 1
        if line != prevline:
               print ('%3d - %s'%(line_num, line))  
        prevline = line

filename = 'Test.txt'
squeeze(filename)

我似乎无法弄清楚我的代码中的缺陷在哪里以及修复了什么?

谢谢,非常有帮助,使用勾选的一个!

4 个答案:

答案 0 :(得分:1)

每一行都应以换行符\n\r\n结尾。所以你的最后一行还没有。

您可以使用str.strip()将其删除。

with open(filename, 'r') as input_f:
    prevline = ''
    line_num = 0

    for line in input_f:
        line_num += 1
        if line.strip() != prevline.strip():     # use strip()
            print('%3d - %s' % (line_num, line))

        prevline = line

答案 1 :(得分:0)

在完成一个循环之后尝试使用列表存储该行,然后在下一个循环中打印之前检查该行是否已存在于列表中。

答案 2 :(得分:0)

最后一行与最后一行之间的差异是最后一行末尾缺少的新行字符。这是一种可以解决这个问题的方法:

def squeeze(filename):
    file = open(filename, 'r')
    prevline = ''
    line_num = 0
    for line in file:
        line_num = line_num + 1
        trimmed_line = line.strip()
        if trimmed_line != prevline:
               print ('%3d - %s'%(line_num, trimmed_line))  
        prevline = trimmed_line

filename = 'Test.txt'

注意:strip()将从末尾删除所有空格。如果这不是您想要的,请考虑使用.replace('\n', '')代替。

答案 3 :(得分:0)

您的代码可以正常使用以下文件:

aajgs ajdgadyy
aajgs ajdgadyy
jagshdg ag
ajdgjga
adgha
adgha

输出是:

>>> squeeze(filename)
  1 - aajgs ajdgadyy

  3 - jagshdg ag

  4 - ajdgjga

  5 - adgha

所以我建议你的for循环中有两个修改:

for line in file:
        line = line.strip() # strip trailing and leading spaces
        if line == '': continue # Skip empty lines
        line_num = line_num + 1
        if line != prevline:
               print ('%3d - %s'%(line_num, line))  
        prevline = line