Как извлечь строки на основе подстроки из двух отдельных текстовых файлов в python? - PullRequest
2 голосов
/ 28 января 2020

У меня есть два текстовых файла. Первый файл имеет вид:

K, 6
J, 5
L, 4

Второй файл имеет вид:

K_1, 6
K_2, 5
J_1, 4
J_2, 4
J_3, 5
L_1, 4

Мне нужен вывод в виде:

K_1, 6, 6, same
K_2, 5, 6, different
J_1, 4, 5, different
J_2, 4, 5, different
J_3, 5, 5, same
L_1, 4, 4, same

где каждая строка начинается со строк из второго текстового файла (первые два значения), затем мне нужно выбрать третье значение на основе подстроки из первого текстового файла (т. е. для K_1 подстрока равна K, и мне нужно выбрать значение 6 из первого текстовый файл). Если значения в каждой строке одинаковы, то в каждой строке должно быть напечатано «одинаково», иначе выведите «разные».

Наконец, мне нужно количество строк с «одинаковыми» и количество строк с «разными» "в выходном файле.

Я пытался написать следующий код, но он не дает ожидаемого результата:

m1 = open('TextFile_1.txt')
m2 = open('TextFile_2.txt')
result = open('Output.txt','w')

lookup_from = {}
l2=[]

for line1 in m1:
    z1 = line1.split(',')[0].strip()
    z2 = z1.split('_')[0].strip()
    z3 = line1.split(',')[1].strip()
    ZX = (z2, z1, z3)
    lookup_from[ZX] = 0

for line2 in m2:
    z11 = line2.split(',')[0].strip()
    z22 = z11.split('_')[0].strip()
    z33 = line2.split(',')[1].strip()
    if z22 in [x for x,_,_ in lookup_from]:
        z4 = (z22, z11, z33)
        z5 = z4 + tuple([x for _,_,x in lookup_from])
        l2.append(z5)

for i in l2:
    result.write(str(i)[1:-1]+'\n')
result.close()

Ответы [ 2 ]

1 голос
/ 28 января 2020

Вы можете избежать всех сложных поисков, если создадите простой ключ, значение dict из первого файла, а затем сгенерируете вывод на лету, читая второй файл:

with open('TextFile_1.txt') as f1:
    lookup = dict([x.strip() for x in line.split(',')] for line in f1)

with open('Output.txt', 'w') as out:
    with open('TextFile_2.txt') as f2:
        for line in f2:
            k, v = [x.strip() for x in line.split(',')]
            n = lookup[k.split('_')[0]]
            out.write(', '.join(
                [k, v, n, 'same' if v == n else 'different']) + '\n')

Вывод:

K_1, 6, 6, same
K_2, 5, 6, different
J_1, 4, 5, different
J_2, 4, 5, different
J_3, 5, 5, same
L_1, 4, 4, same
0 голосов
/ 28 января 2020

Вы можете использовать pd.read_csv() для ввода данных, заменяя file1 и file2 ниже, а затем использовать следующий код:

import pandas as pd
import numpy as np

file1 = pd.DataFrame({'col1': ['K', 'J', 'L'],
                      'col2': [6, 5, 4]})

file2 = pd.DataFrame({'col3': ['K_1', 'K_2','J_1', 'J_2', 'J_3', 'L_1'],
                      'col4': [6, 5, 4, 4, 5, 4]})

file2['col1'] = file2.col3.str[0]

compare = file2.merge(file1)
del(compare['col1'])

compare['result'] = np.where(compare.col4 == compare.col2, 'same', 'different')

print(compare)

Вывод:

  col3  col4  col2     result
0  K_1     6     6       same
1  K_2     5     6  different
2  J_1     4     5  different
3  J_2     4     5  different
4  J_3     5     5       same
5  L_1     4     4       same
...