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

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

如何比較2個不同的csv文件并輸出差異

如何比較2個不同的csv文件并輸出差異

揚帆大魚 2023-12-12 15:18:46
我有 2 個 CSV,分別是 New.csv 和 Old.csv,它們大約有 1K 行和 10 列,其結構如下:如果 new.csv 中有一個 longName(第一列),而 old.csv 中沒有,我希望將整個 new.csv 行附加到changes.csv。我一開始就這樣做,但它根本不起作用:def deltaFileMaker():    with open('Old.csv', 'r', encoding='utf-8') as t1, open('New.csv', 'r', encoding='utf-8') as t2:        fileone = t1.readlines()        filetwo = t2.readlines()    with open('changes.csv', 'w', encoding='utf-8') as outFile:        for line in filetwo:            if line not in fileone:                outFile.write(line)deltaFileMaker()我也嘗試使用 csv-diff 但找不到將其輸出轉換為 csv 文件的方法更新def deltaFileMaker():    from csv_diff import load_csv, compare    diff = compare(        load_csv(open("old.csv",encoding="utf8"), key="longName"),        load_csv(open("new.csv",encoding="utf8"), key="longName")    )        with open('changes.csv', 'w',encoding="utf8") as f:          w = csv.DictWriter(f, diff.keys())        w.writeheader()        w.writerow(diff)deltaFileMaker()這樣做:
查看完整描述

1 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

你看過嗎csv-diff?他們的網站有一個可能合適的示例:

from csv_diff import load_csv, compare

diff = compare(

? ? load_csv(open("one.csv"), key="id"),

? ? load_csv(open("two.csv"), key="id")

)

這應該返回一個dict對象,您可以將其解析為 CSV 文件。要將字典解析為行,這是一個示例。注意:正確編寫更改很困難,但這更多的是概念驗證 - 根據您的意愿進行修改


from csv_diff import load_csv, compare

from csv import DictWriter


# Get all the row headers across all the changes

headers = set({'change type'})

for key, vals in diff.items():

? ? for val in vals: # Multiple of the same difference 'type'

? ? ? ? headers = headers.union(set(val.keys()))


# Write changes to file

with open('changes.csv', 'w', encoding='utf-8') as fh:

? ? w = DictWriter(fh, headers)

? ? w.writeheader()

? ? for key, changes in diff.items():

? ? ? ? for val in changes: # Add each instance of this type of change

? ? ? ? ? ? val.update({'change type': key}) # Add 'change type' data

? ? ? ? ? ? w.writerow(val)

對于文件one.csv:


id,? ? ?name, age

?1,? ? ?Cleo,? ?4

?2, Pancakes,? ?2

和two.csv:


id,? ?name, age

?1,? ?Cleo,? ?5

?3, Bailey,? ?1

4,? Elliot,? 10

運行此命令會產生:


change type,? ? ?name, id,? ? ? ? ? ? ? ?changes, age, key

? ? ? added,? ?Bailey,? 3,? ? ? ? ? ? ? ? ? ? ? ,? ?1,

? ? ? added,? ?Elliot,? 4,? ? ? ? ? ? ? ? ? ? ? ,? 10,

? ? removed, Pancakes,? 2,? ? ? ? ? ? ? ? ? ? ? ,? ?2,

? ? changed,? ? ? ? ?,? ?, "{'age': ['4', '5']}",? ? ,? ?1

因此并不適合所有更改,但對于添加/刪除的行非常有效。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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