сравнение и приведение к одному шаблону двух файлов .txt

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

Пример. Содержание файлов:

filetxt1

Bob:20
Bob:22
Bob:23
Tom:20
Tom:23
Tom:40
Tom:19
Albert:21
Albert:22
Albert:31
Albert:24
Mark:19
Mark:22
Mark:11

filetxt2

Bob:30
Bob:32
Bob:40
Tom:11
Tom:32
Albert:10
Albert:90
Albert:67
Mark:77

Мне нужно сравнить эти два файла, и во втором файле дописать например 'Tom' два раза, и добавить значение, которое идет после последнего Tom, в данном случае 32, на выходе должно получиться следующее содержание:

Output

Bob:30
Bob:32
Bob:40
Tom:11
Tom:32
Tom:32
Tom:32
Albert:10
Albert:90
Albert:67
Albert:67
Mark:77
Mark:77
Mark:77

Как можно дописать между строк, чтобы порядок сохранялся? Пытался сравнивать построчно, но не пойму, как можно дописать, недостающее имя со значением предыдущего имени.


Ответы (2 шт):

Автор решения: MaxU

Воспользуйтесь модулем Pandas:

import pandas as pd  #   pip install pandas

df1 = pd.read_csv("f1.txt", sep=":", header=None, names=["name", "val"])
df2 = pd.read_csv("f2.txt", sep=":", header=None, names=["name", "val"])

res = (df2
       .assign(x=df2.groupby("name").cumcount())
       .merge(df1[["name"]].assign(x=df1.groupby("name").cumcount()), 
              how="right")
       .ffill()
       .drop(columns="x")
       .astype({"val":"int"}))

res.to_csv("result.csv", sep=":", index=False, header=False)

результат:

Bob:30
Bob:32
Bob:40
Tom:11
Tom:32
Tom:32
Tom:32
Albert:10
Albert:90
Albert:67
Albert:67
Mark:77
Mark:77
Mark:77
→ Ссылка
Автор решения: strawdog

Вот такой вариант еще:

import pandas as pd

df1 = pd.read_csv("file1.txt", sep=":", header=None)
df2 = pd.read_csv("file2.txt", sep=":", header=None)

tmp = pd.DataFrame()

for i, g in df2.groupby(0, sort=False):
    g = g.append([(g.iloc[[-1]]) for x in range(len(df1.loc[df1[0]==i]) - len(g))])
    tmp = tmp.append(g)

tmp:

        0   1
0     Bob  30
1     Bob  32
2     Bob  40
3     Tom  11
4     Tom  32
4     Tom  32
4     Tom  32
5  Albert  10
6  Albert  90
7  Albert  67
7  Albert  67
8    Mark  77
8    Mark  77
8    Mark  77

ну и для записи результата в файл:

tmp.to_csv("res.txt", sep=":", index=False, header=False)
→ Ссылка