#python
#python
Вопрос:
Итак .. вот что я пытаюсь сделать .. Для каждой строки в файле данных проверьте, содержит ли другой файл эту строку.
Я пробовал некоторые материалы из других сообщений, но ни один из них не был хорош.
Приведенный ниже код говорит, что он не нашел ни одной строки, которую искал, даже если они присутствовали где-то в файле.
def search():
file1= open('/home/example/file1.txt', 'r')
datafile= open('/home/user/datafile.txt', 'r')
for line in datafile:
if line in file1:
print '%s found' % line
else:
print '%s not found' % line
search()
Комментарии:
1. вы пытаетесь найти одинаковые строки в обоих файлах?
2. Вам нужно добавить a
.read()
в открывшийся файл, или вы можете добавить его после открытия файла в цикле for .3. .read() работает, но только если строка идентична. Если ему нужно выполнить поиск «hello», он не сможет найти его, если он записан как «hello123». Есть способ решить эту проблему?
Ответ №1:
Предполагая, что содержимое первого файла не очень велико, вы можете прочитать весь файл как строку, а затем проверить, используя ограничение строки:
def search():
file1_content = open('/home/example/file1.txt').read()
datafile = open('/home/user/datafile.txt')
for line in datafile:
if line in file1_content:
print '%s found' % line
else:
print '%s not found' % line
Обратите внимание, что по умолчанию используется режим open
is 'r'
, поэтому вам действительно не нужно передавать этот параметр, если вы читаете в текстовом режиме.
Комментарии:
1. Вы также забыли прочитать при открытии «файла данных», либо добавьте его в цикл for, so
for line in datafile.read()
или при открытии файла.2. @PrestonHager Это не будет совершенно необходимо. Строки будут одинаково извлечены без вызова
read
. И обратите внимание, что после использования выread
не можете неявно перебирать строки, кроме как снова вызватьsplitlines
3. Хорошо, я не тестировал код, поэтому не могу сказать наверняка. Но я почти уверен, что вам нужно вызвать read или что-то в этом роде с
.split('n')
помощью . Не говорю, что вы ошибаетесь, но я не думаю, что вы правы.4. Вы можете добавить .readlines() вместо read, и он будет повторяться по списку с каждой строкой. Нет необходимости разделять
5. @chuseuiti В этом не будет необходимости. Каждая строка будет создана путем итерации по файловому объекту, аналогично
readlines
, но без дополнительного вызова метода
Ответ №2:
Вы можете прочитать файл в a set
, а затем проверить включение во второй файл. set
обычно они быстрее проверяют включение в список.
def search():
file1 = set(open('/home/example/file1.txt'))
datafile= open('/home/user/datafile.txt', 'r')
for line in datafile:
if line in file1:
print '%s found' % line
else:
print '%s not found' % line
Вы также можете использовать операции set для извлечения, например, всех строк, которых нет в первом файле:
set(open('/home/user/datafile.txt', 'r')) - set(open('/home/example/file1.txt'))