Я вижу ошибку в том, что вы пытаетесь объединить список s
с двумя строками, но это не разрешено.Правильный способ - добавить дополнительный элемент ss[1]
в список s
, а затем распечатать результаты.Или просто используйте строку1 в качестве строки.
Вам также необходимо обработать случай, когда s[0] != ss[0]
, и в этом случае вы хотите просто распечатать line1
.
Одно важное замечание касаетсяreadlines
, поскольку он не сбрасывает указатель файла на начало файла автоматически при каждом его вызове.Вместо этого, как только указатель файла достиг конца, он остается там.
Мало возможных альтернатив.
Добавить оператор file2.seek(0)
непосредственно перед циклом поиска
Загрузить содержимое файла (s) в списках и перебирать их, например:
file1_content = open('file1.ext', 'r').readlines()
for line1 in file1_content: ...
Вставить оператор файла open
вцикл for
, например:
for line2 in open('file2.ext', 'r')
Обратите внимание, что файлы являются итеративными, поэтому вам не нужно readlines()
.
Лучшее решение зависит, конечно, от нескольких факторов.Я выберу здесь # 3, так как считаю более питоническим:
outfile = open('outfile.ext', 'w')
for line1 in open('file1.ext', 'r'):
s = line1.split ()
# reset search flag
found = False
# start search loop
for line2 in open('file2.ext', 'r'):
ss = line2.split ()
# search for a match
if s [0] == ss[0]:
# match found: set the flag
found = True
# write to file with additional element appended (*)
outfile.write (line1.strip() + ' ' + ss[1] + '\n'))
# No match found: just save the original line
if not found:
outfile.write(line1)
(*) должна быть новая строка, которую мы удалим перед добавлением последнего элемента.Когда вы пишете в файл, мы должны добавить это обратно.
Также посмотрите здесь: https://eval.in/994943 или вариант здесь https://eval.in/994944