list - 如何按值比较python中的2个CSV文件并打印差异?
问题描述
我有 2 个相同尺寸的 CSV 文件。在下面使用的示例中,尺寸为 3*3(3 个逗号分隔值和 3 行)。它可以是尺寸为 100*10000 的文件
文件 1.csv:
姓名、身份证、职业
汤姆,1 岁,老师
迪克,2 岁,演员
文件 2.csv:
姓名、身份证、职业
迪克,2 岁,演员
汤姆,1 岁,警察
我想明智地比较文件元素(例如:老师==警察)
如果我可以使用主键 (ID) 比较列表以防列表不按顺序排列,那就太好了。我想输出如下内容:
ID = 1的职业不匹配,即教师<>警察
上面输出中的 ID 是主键。
注意:文件可能非常大(100 列 * 10000 条记录)
下面是我用来从 2 个 csv 文件中获取列表 A 和 B 的代码。但这非常乏味,使用这么长的代码我只能得到 2 行代码。
source_file = open('File1.csv', 'r')
file_one_line_1 = source_file.readline()
file_one_line_1_str = str(file_one_line_1)
file_one_line_1_str_replace = file_one_line_1_str.replace('\n', '')
file_one_line_1_list = list(file_one_line_1_str_replace.split(','))
file_one_line_2 = source_file.readline()
file_one_line_2_str = str(file_one_line_2)
file_one_line_2_str_replace = file_one_line_2_str.replace('\n', '')
file_one_line_2_list = list(file_one_line_2_str_replace.split(','))
file_one_line_3 = source_file.readline()
file_one_line_3_str = str(file_one_line_3)
file_one_line_3_str_replace = file_one_line_3_str.replace('\n', '')
file_one_line_3_list = list(file_one_line_3_str_replace.split(','))
A = [file_one_line_1_list, file_one_line_2_list, file_one_line_3_list]
target_file = open('File2.csv', 'r')
file_two_line_1 = target_file.readline()
file_two_line_1_str = str(file_two_line_1)
file_two_line_1_str_replace = file_two_line_1_str.replace('\n', '')
file_two_line_1_list = list(file_two_line_1_str_replace.split(','))
file_two_line_2 = source_file.readline()
file_two_line_2_str = str(file_two_line_2)
file_two_line_2_str_replace = file_two_line_2_str.replace('\n', '')
file_two_line_2_list = list(file_two_line_2_str_replace.split(','))
file_two_line_3 = source_file.readline()
file_two_line_3_str = str(file_two_line_3)
file_two_line_3_str_replace = file_two_line_3_str.replace('\n', '')
file_two_line_3_list = list(file_two_line_3_str_replace.split(','))
B = [file_two_line_1_list, file_two_line_2_list, file_two_line_3_list]
使用下面的代码,它工作顺利:
source_file = 'Book1.csv'
target_file = 'Book2.csv'
primary_key = 'id'
# read source and target files
with open(source_file, 'r') as f:
reader = csv.reader(f)
A = list(reader)
with open(target_file, 'r') as f:
reader = csv.reader(f)
B = list(reader)
# get the number of the 'ID' column
column_names = A[0]
column_id = column_names.index(primary_key)
# get the column names without 'ID'
values_name = column_names[0:column_id] + column_names[column_id + 1:]
# create a dictionary with keys in column `column_id`
# and values the list of the other column values
A_dict = {a[column_id]: a[0:column_id] + a[column_id + 1:] for a in A}
B_dict = {b[column_id]: b[0:column_id] + b[column_id + 1:] for b in B}
# iterate on the keys and on the other columns and print the differences
for id in A_dict.keys():
for column in range(len(column_names) - 1):
if A_dict[id][column] != B_dict[id][column]:
print(f"{primary_key} = {id}\t{values_name[column]}: {A_dict[id][column]} != {B_dict[id][column]}")```
Thanks.
解决方案
要读取 csv 并将内容存储为嵌套列表,请参阅https://stackoverflow.com/a/35340988/12669658
要按元素比较列表,请参阅您的专门问题: https ://stackoverflow.com/a/59633822/12669658