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