#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.