Skip to content

Instantly share code, notes, and snippets.

@simonw
Created March 13, 2019 05:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save simonw/215e738c91b5ab90327a9833d7bb947b to your computer and use it in GitHub Desktop.
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
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