Как выполнить поиск в каждой строке файла в другом файле с помощью python?

#python #file #with-statement

#python #файл #с помощью-statement

Вопрос:

Мой expected_cmd.txt (скажем, f1) является

 mpls ldp
snmp go
exit
  

и мой configured.txt (скажем, f2) является

 exit
  

Вот код, с которым я пытаюсь выполнить поиск по всем строкам f1 в f2

 with open('expected_cmd.txt', 'r') as rcmd, open('%s.txt' %configured, 'r') as f2:
    for line in rcmd:
            print 'line present is '   line
            if line in f2:
                    continue
            else:
                    print line
  

Итак, в основном я пытаюсь напечатать строку из первого файла, которой нет во втором файле.
Но с приведенным выше кодом я получаю вывод в виде

 #python validateion.py
line present is mpls ldp

mpls ldp

line present is snmp go 

snmp go 

line present is exit

exit
  

Не уверен, почему он печатает exit то, что соответствует.

Также мне интересно, есть ли встроенная функция для этого в python?

Ответ №1:

 with open('%s.txt' %configured,'r') as f2:
    cmds = set(i.strip() for i in f2)
with open('expected_cmd.txt', 'r') as rcmd:
    for line in rcmd:
            if line.strip() in cmds:
                    continue
            else:
                    print line
  

Это устранило мою проблему.

Комментарии:

1. Точно. Теперь вы читаете f2 только один раз, поэтому вы избегаете исходной проблемы.

Ответ №2:

Объект file, который вы получаете при open создании файла, содержит информацию о файле и текущем местоположении в файле. Позиция — это начало файла по умолчанию, когда вы открываете его в 'r' режиме 1.

Когда вы считываете некоторые данные из файла (или записываете в него), позиция перемещается. Например, f.read() считывает все и перемещается в конец файла. Повторное f.read() ничего не читает.

Аналогичная вещь происходит, когда вы перебираете файл (например line in f2 ).

Я бы предположил, что, если размер файлов не превышает много гигабайт, вы должны прочитать оба файла, а затем выполнить остальную логику в памяти, например:

 with open('expected_cmd.txt', 'r') as f1:
    lines1 = list(f1)

with open('%s.txt' %configured, 'r') as f2:
    lines2 = list(f2)
  

Затем вы можете реализовать логику:

 for line in lines1:
    if line not in lines2:
        print(line)
  

Ответ №3:

Вы прочитали configured.txt полностью и выполните поиск, удалив строки в rcmd.