亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較 2 個不同的 csv 文件并將所有更改輸出到新的 csv 中

比較 2 個不同的 csv 文件并將所有更改輸出到新的 csv 中

牛魔王的故事 2023-12-29 14:31:50
我有 2 個 CSV,分別是 New.csv 和 Old.csv,如下所示:舊的.csvlongName,shortName,eventType,number,severityACTAGENT201,ACAT201,RES,1,INFOACTAGENT202,ACAT202,RES,2,ALERTACODE801,AC801,ADMIN,1,MINORACODE802,AC802,ADMIN,2,MINORACODE102,AC102,COMM,2,CRITICALACODE103,AC103,COMM,3,CRITICALACODE104,AC104,COMM,4,CRITICALACODE105,AC105,COMM,5,CRITICALACODE106,AC106,COMM,6,CRITICAL新.csvlongName,shortName,eventType,number,severityACTAGENT201,ACAT201,RES,1,INFOACTAGENT202,ACAT202,RES,2,ALERTACODE801,AC801,ADMIN,1,MINORACODE802,AC802,ThisHasBeenChanged,2,MINORACODE102,AC102,COMM,2,CRITICALACODE103,AC103,COMM,3,CRITICALACODE104,AC104,COMM,4,THISHASBEENCHANGEDACODE105,AC105,COMM,5,CRITICALACODE106,AC106,COMM,6,CRITICAL如果行中的某一列中的數據已在 old.csv 和 new.csv 之間進行了修改/更改,則應將整行附加到changes.csv,就像 old.csv 中的每一列一樣new.csv 彼此相鄰:
查看完整描述

1 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

首先,將兩個 CSV 文件讀入字典,使用longName值作為鍵。


import csv


with open(old_csv_file, "r") as fh:

    reader = csv.reader(fh)

    old_csv = {row[0]: row for row in reader}


with open(new_csv_file, "r") as fh:

    reader = csv.reader(fh)

    new_csv = {row[0]: row for row in reader}


然后,使用集合操作可以輕松找到新添加和刪除的鍵。


old_longNames = set(old_csv.keys())

new_longNames = set(new_csv.keys())


# common: set intersection

common_longNames = old_longNames.intersection(new_longNames)

# removed: whatever's in old but not in new

removed_longNames = old_longNames - new_longNames

# added: whatever's in new but not in old

added_longNames = new_longNames - old_longNames

最后,迭代公共集以查找有變化的地方:


changed_longNames = []

for key in common_longNames:

    old_row = old_csv[key]

    new_row = new_csv[key]

    # if any(o != n for o, n in zip(old_row, new_row)):

    if old_row != new_row:

        # this row has at least one column changed. Do whatever

        print(f"LongName {key} has changes")

        changed_longNames.append(key)

或者,作為列表理解:


changed_longNames = [key for key in common_longNames if old_csv[key] != new_csv[key]]

將所有內容寫入新的 csv 文件也相當簡單。請注意,這些集合不保留順序,因此您可能無法以相同的順序獲得結果。


with open("deleted.csv", "w") as fh:

    writer = csv.writer(fh)

    for key in removed_longNames:

        writer.writerow(old_csv[key])


with open("inserted.csv", "w") as fh:

    writer = csv.writer(fh)

    for key in added_longNames:

        writer.writerow(new_csv[key])


with open("changed.csv", "w") as fh:

    writer = csv.writer(fh)

    for key in changed_longNames:

        old_row = old_csv[key]

        new_row = new_csv[key]

        merged_row = []

        for oi, ni in zip(old_row, new_row):

            merged_row.append(oi)

            merged_row.append(ni)

        writer.writerow(merged_row)


查看完整回答
反對 回復 2023-12-29
  • 1 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號