Сравните 2 CSV-файла (кодированный = "utf8"), сохраняя формат данных - PullRequest
0 голосов
/ 09 января 2020

У меня есть 2 списка акций (новый и старый). Как я могу сравнить его, чтобы увидеть, какие элементы были добавлены, а какие удалены (с удовольствием добавляю их в 2 разных файла, добавленных и удаленных)?

До сих пор мне надоело смотреть строки за строкой .

import csv

new = "new.csv"
old = "old.csv"
add_file = "add.csv"
remove_file = "remove.csv"

with open(new,encoding="utf8") as new_read, open(old,encoding="utf8") as old_read:
    new_reader = csv.DictReader(new_read)
    old_reader = csv.DictReader(old_read)
    for new_row in new_reader :
        for old_row in old_reader:
            if old_row["STOCK CODE"] == new_row["STOCK CODE"]:
                print("found")

Работает на 1 предмет. если я добавлю * else: *, он просто продолжит печатать, пока не найдет. Так что это не точный способ сравнения файлов.

У меня есть строки по 5 тыс.

Должен быть лучший способ добавить различия в 2 разных файла и сохранить одинаковые данные структура в то же время?

Примечание: я устал от этой ссылки Python: сравнить два файла CSV и распечатать различия 2 незначительных проблемы: 1. структура данных не сохраняется 2. нет ссылки на смену местоположения

1 Ответ

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

Вы можете просто прочитать данные в память, а затем сравнить. Я использовал наборы для кодов в этом примере для более быстрого поиска.

import csv

def get_csv_data(file_name):
    data = []
    codes = set()
    with open(file_name, encoding="utf8") as csv_file:
        reader = csv.DictReader(csv_file)
        for row in reader:
            data.append(row)
            codes.add(row['STOCK CODE'])

    return data, codes

def write_csv(file_name, data, codes):
    with open(file_name, 'w', encoding="utf8", newline='') as csv_file:
        headers = list(data[0].keys())
        writer = csv.DictWriter(csv_file, fieldnames=headers)

        writer.writeheader()
        for row in data:
            if row['STOCK CODE'] not in codes:
                writer.writerow(row)

new_data, new_codes = get_csv_data('new.csv')
old_data, old_codes = get_csv_data('old.csv')

write_csv('add.csv', new_data, old_codes)
write_csv('remove.csv', old_data, new_codes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...