Как определить, является ли одна строка длиннее другой, а затем распечатать, где происходит несоответствие?

Я пишу программу, которая берет два введенных пользователем файла и определяет, есть ли какие-либо несоответствия между ними. Если один файл длиннее другого, я хочу напечатать, что в более коротком файле нет символа для сравнения по этому индексу с более длинным файлом. На данный момент моя программа перебирает и файлы, и распечатки, где встречаются несоответствия, но останавливается, как только достигает конца более короткого файла.

Мой код выглядит следующим образом:

def character_difference(userfile1, userfile2):
    opened_file_1 = open(userfile1)
    opened_file_2 = open(userfile2)
    f1 = opened_file_1.read(-1)
    f2 = opened_file_2.read(-1)
    for index, (char1, char2) in enumerate(zip(f1, f2)):
        if char1 != char2:
            print("Mismatch at character", index, "%s != %s" % (char1, char2))
        else:
            continue
    opened_file_1.close()
    opened_file_2.close()
def main():
    userfile1 = input("Enter the name of the first file: ")
    userfile2 = input("Enter the name of the second file: ")
    character_difference(userfile1, userfile2)

main()

Как мне добавить оператор print, который говорит, что в пустом пространстве нет символа? Я не уверен, как продолжать перечислять остальную часть более длинной строки.

1 ответ

zip будет повторяться только до тех пор, пока ему не передадут самые короткие итерации. Цитирование документации,

Итератор останавливается, когда самая короткая входная итерация исчерпана.

Вместо этого используйте itertools.zip_longest выполнять итерацию до самого длинного из итераций и использовать значение по умолчанию для более коротких итераций. Цитирование документации,

Если итерации имеют неравную длину, пропущенные значения заполняются значением заполнения. Итерация продолжается, пока самая длинная итерация не будет исчерпана.

Например,

from itertools import zip_longest

with open(userfile1) as f1, open(userfile2) as f2:
  f1 = f1.read(-1)
  f2 = f2.read(-1)

for idx, (c1, c2) in enumerate(zip_longest(f1, f2, fillvalue="")):
  if c1 != c2:
    print("Mismatch at character", idx, "%s != %s" % (c1, c2))
Другие вопросы по тегам