Допущения: - 1 идентификатор в строке - такое же количество идентификаторов -Если zip не будет работать до тех пор, пока не будет уменьшено количество идентификаторов, остальное не изменится
Вы можете изменить код, если 1 идентификатор / строка не удерживается: см. @ end.
Создание демонстрационных данных:
file1 = r'.\file1.txt'
file2 = r'.\file2.txt'
with open(file1,"w") as f:
f.write("trivia\n")
for k in range(1000,1003):
for i in range(200,202):
f.write(f"some text id{k}_{i} some more text\n ")
f.write("trivia\n")
f.write("trivia\n")
with open(file2,"w") as f:
for k in range(4000,4003):
f.write("trivia\n")
for i in range(700,702):
f.write(f"llll id{k}_{i} fffff\n")
Файлы процесса:
Заменяет любой n-йидентификатор в file1 по n-му идентификатору в file2 : - найти все идентификаторы в file1 => list - найти все идентификаторы в file2 => list - сжать их, чтобы получить кортежи, которые сообщаютчто вам заменить чем - снова прочитать file1, создать выходной файл - для каждой строки файла 1: - заменить i-ую вещь из заархивированных попаданий, если она в строке - продвинуть индекс i - записать строку в результаты - иначе скопировать строку дословнок результатам
Код:
import re
pattern = re.compile(r'id\d{4}_\d{3}')
with open(file1) as f :
f1 = pattern.findall(f.read())
with open(file2) as f :
f2 = pattern.findall(f.read())
change = list(zip(f1,f2))
with open("result.txt", 'w') as f, open(file1) as r:
i = 0
lc = len(change)
for line in r:
if i < lc and change[i][0] in line:
line = line.replace(change[i][0],change[i][1])
i += 1
f.write(line)
print("# FILE1:\n", open(file1).read())
print("# FILE2:\n", open(file2).read())
print("# RESULT:\n", open("result.txt").read())
Вывод:
# FILE1:
trivia
some text id1000_200 some more text
some text id1000_201 some more text
some text id1001_200 some more text
some text id1001_201 some more text
some text id1002_200 some more text
some text id1002_201 some more text
trivia
trivia
# FILE2:
trivia
llll id4000_700 fffff
llll id4000_701 fffff
trivia
llll id4001_700 fffff
llll id4001_701 fffff
trivia
llll id4002_700 fffff
llll id4002_701 fffff
# RESULT:
trivia
some text id4000_700 some more text
some text id4000_701 some more text
some text id4001_700 some more text
some text id4001_701 some more text
some text id4002_700 some more text
some text id4002_701 some more text
trivia
trivia
Итерация по кортежам по idx i
- это оптимизация.С несколькими идентификаторами в строке вы можете сделать:
for line in r:
for old_id, new_id in change:
line = line.replace(old_id,new_id)
f.write(line)
Но это медленнее, потому что каждая строка проверяет все возможные совпадения идентификатора.