Как сравнить 2 CSV-файла в значении python по значению и вывести разницу? - PullRequest
0 голосов
/ 08 января 2020

У меня есть 2 CSV-файла одинаковых размеров. В приведенном ниже примере используются размеры 3 * 3 (3 значения через запятую и 3 строки). Это могут быть файлы размером 100 * 10000

File1.csv:

Имя, идентификатор, профессия

Том, 1, Учитель

Дик, 2, Актер

File2.csv:

Имя, ID, Профессия

Дик, 2, Актер

Том, 1, Police

Я хочу сравнить файлы поэлементно (например, Teacher == Police)

Было бы здорово, если бы я мог сравнивать списки, используя первичный ключ (ID) ) если список не в порядке. Я хотел бы иметь что-то вроде ниже:

Профессия ID = 1 не совпадает, т.е. учитель <> Police

ID в выходных данных выше является основным ключ.

Примечание: файл может быть очень большим (100 столбцов * 10000 записей)

Ниже приведен код, который я использовал для получения списков A и B из 2 файлов CSV. Но это очень утомительно, и я мог получить только 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.

1 Ответ

0 голосов
/ 08 января 2020

Чтобы прочитать csv и сохранить содержимое в виде вложенных списков, см. { ссылка }


Для сравнения списков по элементам обратитесь к своему специализированному вопросу: { ссылка }

...