Печать несовпадающих (уникальных) строк в файле

Я пытаюсь создать функцию, которая открывает файл (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 ответа

Решение

Каждая строка должна заканчиваться символом новой строки \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

Ваш код работает нормально, как для приведенного ниже файла:

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

Попробуйте использовать список для сохранения строки после завершения одного цикла, а затем перед печатью в следующем цикле проверьте, существует ли строка уже в списке.

Разница между последней, но одной и последней строкой заключается в отсутствии символа новой строки в конце последней строки. Вот один из способов обойти это:

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', '') вместо.

Другие вопросы по тегам