将一行(文件)中的多个字符串与其他文件中同一行号中的单个字符串进行比较

Comparing multiple string in one line (file) to single string in other file same line number

我正在使用 python 3.8 的应用程序出现以下问题:我有两个文件

一个是 actual_results.txt 文件,每行包含一个字符串,例如第 1 行 "Encryption Has Failed" 第 2 行“随机数生成器已通过”。 . .第 N 行等然后第二个文件是 expected_results,每行将有多个字符串,代表每个测试结果的可能结果,例如第 1 行 "Encryption Has Failed, Encryption Passed, Data Corruption, False Key Used ..." 类似地,第 2 行 "Random Numbers generator has failed, Random Numbers generator Passed, Data Corruption, ..."。 . .第 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)

这给出了基于整行比较的输出,而不是将一个文件的每一行中的多个字符串 (expected_results) 与另一个文件的每一行中的单个字符串 (actual_result.txt) 进行比较。

问题是 如何将一个文件行中的多个逗号分隔字符串与另一个文件的同一行中的一个字符串进行比较?

我想过一个解决方案,但我不确定是否可行。

用多个字符串遍历一个文件的每一行以使用

分隔
line.split(',')

将列表中的每个项目与 actual_results 文件中同一行号上的单个字符串进行比较时放入列表中。

如果要检查字符串是否在列表中,请使用如下表达式:

search_string in (list_of_candidates)

您正在将第一个文件的每一行与第二个文件的每一行进行比较。我想你要做的是逐行比较每个文件。

是这样的吗?

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')

您也可以试试:

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')

您可能不想,但您可以使用 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

我的 expected.csv 文件包含:

error1,error4,error5
error2,error6,error7
error8,error9