Сравнение нескольких строк в одной строке (файле) с одной строкой в ​​другом файле с тем же номером строки - PullRequest
0 голосов
/ 02 февраля 2020

Я использую python 3.8 для приложения, в котором проблема такова: у меня есть два файла

один из них actual_results.txt файл, который состоит из одной строки в каждой строке, которая например, строка 1 «Сбой шифрования». Строка 2 «Генератор случайных чисел пройден». , , Строка N et c Тогда второй файл - Ожидаемый_результат , который будет иметь несколько строк в каждой строке, которые будут представлять возможные результаты каждого теста, например, Строка 1 «Сбой шифрования, Шифрование прошло, Повреждение данных, Ложь» Ключ используется ... "Аналогично, строка 2" Генератор случайных чисел не работает, генератор случайных чисел пройден, повреждение данных, ... ". , , Строка N

На основе сравнения двух файлов между каждой строкой будет создан третий файл, который будет представлять результаты в каждой строке как: найденные или не найденные из ожидаемых результатов. До сих пор я пробовал следующее:

with open('actual_results.txt', 'r') as file1:
with open('expected_results.txt', 'r') as file2:
    same = set(file1).intersection(file2)


with open('final_output_file.txt', 'w') as file_out:
       for line in same:
           file_out.write(line)

Это дает вывод на основе сравнения полной строки, а не сравнения нескольких строк в каждой строке одного файла (Ожидаемые_результаты) с одной строкой в ​​каждой строке другого файла (actual_result.txt).

Вопрос: Как сравнить несколько разделенных запятыми строк в строках одного файла с одной строкой другого файла с одной строкой?

I Я думал о решении, которое, я не уверен, будет работать.

итерация по каждой строке одного файла с несколькими строками для разделения, используя

line.split(',')

, чтобы поместить в список при сравнении этого списка каждый элемент с одной строкой в ​​том же номере строки в файле actual_results.

Ответы [ 4 ]

1 голос
/ 02 февраля 2020

Вы сравниваете каждую строку первого файла с каждой строкой второго файла. Я думаю, что вы хотите сделать, это сравнить каждый файл строка за строкой.

Что-то вроде этого?

lines = []
with open('actual_results.txt') as actual, open('expected_results.txt') as expected:
  try:
    while True:
      a, e = next(actual), next(expected)
      if a in e.split(','):
        lines.append((a, e, True))
      else:
        lines.append((a, e, False))
  except StopIteration:
    pass

with open('final_output_file.txt', 'w') as output:
  for actual, expected, result in lines:
    if result:
      output.write('found\n')
    else:
      output.write('not found\n')
0 голосов
/ 02 февраля 2020

Возможно, вы не хотите, но вы можете использовать pandas для выполнения тяжелой работы.

import pandas as pd

actuals = pd.read_csv('./actuals.csv', header=None)
expected = pd.read_csv('./expected.csv', header=None, delimiter='\n')

df = pd.concat([actuals, expected], axis=1, ignore_index=True)

df.apply(lambda row: True if row[0] in row[1].split(',') else False, axis=1)

Где фактический фрейм данных:

        0
0  error1
1  error2
2  error3

Ожидаемый фрейм данных :

                      0
0  error1,error4,error5
1  error2,error6,error7
2         error8,error9

Объединенный фрейм данных:

        0                     1
0  error1  error1,error4,error5
1  error2  error2,error6,error7
2  error3         error8,error9

И сравнение дает:

0     True
1     True
2    False

Мой файл actuals.csv содержал:

error1
error2
error3

И мой ожидаемый файл .csv содержал:

error1,error4,error5
error2,error6,error7
error8,error9
0 голосов
/ 02 февраля 2020

Вы также можете попробовать:

with open('actual_results.txt', 'r') as file1:
    actual = file1.readlines()

with open('expected_results.txt', 'r') as file2:
    expected = file2.readlines()

with open('final_output_file.txt', 'w') as file_out:
    for a, e in zip(actual, expected):
        file_out.write('found\n' if a.strip() in e.strip().split(', ') else 'not found\n')
0 голосов
/ 02 февраля 2020

Если вы хотите проверить, есть ли строка в списке, используйте выражение вроде этого:

search_string in (list_of_candidates)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...