Created
March 13, 2019 05:03
-
-
Save simonw/215e738c91b5ab90327a9833d7bb947b to your computer and use it in GitHub Desktop.
The earlier version of what is now https://github.com/simonw/csv-diff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import csv | |
from dictdiffer import diff | |
def load_trees(filepath): | |
fp = csv.reader(open(filepath)) | |
headings = next(fp) | |
rows = [dict(zip(headings, line)) for line in fp] | |
return {r["TreeID"]: r for r in rows} | |
def compare(prev_trees, trees): | |
# Have any rows been removed or added? | |
removed = [id for id in prev_trees if id not in trees] | |
added = [id for id in trees if id not in prev_trees] | |
# How about changed? | |
removed_or_added = set(removed) | set(added) | |
potential_changes = [id for id in trees if id not in removed_or_added] | |
changed = [id for id in potential_changes if trees[id] != prev_trees[id]] | |
# Now generate the readable summary | |
summary = [] | |
title = [] | |
if added: | |
fragment = "{} tree{} added".format(len(added), "" if len(added) == 1 else "s") | |
title.append(fragment) | |
summary.append(fragment + "\n") | |
for id in added: | |
summary.append(" {}".format(repr(trees[id]))) | |
summary.append("") | |
if removed: | |
fragment = "{} tree{} removed".format(len(removed), "" if len(removed) == 1 else "s") | |
title.append(fragment) | |
summary.append(fragment + "\n") | |
for id in removed: | |
summary.append(" {}".format(repr(prev_trees[id]))) | |
summary.append("") | |
if changed: | |
fragment = "{} tree{} changed".format(len(changed), "" if len(changed) == 1 else "s") | |
title.append(fragment) | |
summary.append( | |
fragment + '\n' | |
) | |
for id in changed: | |
d = list(diff(prev_trees[id], trees[id])) | |
summary.append(" Tree {}".format(id)) | |
for _, field, (prev_value, current_value) in d: | |
summary.append( | |
' {}: "{}" => "{}"'.format(field, prev_value, current_value) | |
) | |
summary.append("") | |
summary.append("") | |
return (", ".join(title) + "\n\n" + ("\n".join(summary))).strip() | |
if __name__ == "__main__": | |
print( | |
compare( | |
load_trees("Street_Tree_List-old.csv"), load_trees("Street_Tree_List.csv") | |
) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment