2

我正在尝试创建一个打开文件(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

4 回答 4

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
于 2014-11-27T11:39:57.320 回答
0

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

于 2014-11-27T11:35:39.070 回答
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', '')改用。

于 2014-11-27T11:39:32.740 回答
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
于 2014-11-27T11:41:56.097 回答