csv-diff 作者 simonw

星标

README 源代码

csv-diff

PyPI Changelog Tests License

用于查看两个 CSV、TSV 或 JSON 文件之间差异的工具。请参阅为旧金山官方树木列表生成提交日志(以及sf-tree-history 仓库提交日志),了解该项目的背景信息。

安装

pip install csv-diff

用法

考虑两个 CSV 文件

one.csv

id,name,age
1,Cleo,4
2,Pancakes,2

two.csv

id,name,age
1,Cleo,5
3,Bailey,1

csv-diff 可以显示文件之间差异的易读摘要

"5" 1 row added id: 3 name: Bailey age: 1 1 row removed id: 2 name: Pancakes age: 2">
$ csv-diff one.csv two.csv --key=id
1 row changed, 1 row added, 1 row removed

1 row changed

  Row 1
    age: "4" => "5"

1 row added

  id: 3
  name: Bailey
  age: 1

1 row removed

  id: 2
  name: Pancakes
  age: 2

--key=id 选项意味着将 id 列视为唯一键,用于识别哪些记录已更改。

该工具会自动检测您的文件是逗号分隔还是制表符分隔。您可以使用 --format=tsv--format=csv 覆盖此自动检测并强制工具使用特定格式。

您也可以向其提供 JSON 文件,前提是它们是一个对象数组,其中每个对象具有相同的键。如果您的输入文件是 JSON,请使用 --format=json

使用 --show-unchanged 在差异输出中包含至少有一处更改的行的未更改值的完整详细信息

"5" Unchanged: name: "Cleo"">
% csv-diff one.csv two.csv --key=id --show-unchanged
1 row changed

  id: 1
    age: "4" => "5"

    Unchanged:
      name: "Cleo"

JSON 输出

您可以使用 --json 选项获取机器可读的差异

$ csv-diff one.csv two.csv --key=id --json
{
    "added": [
        {
            "id": "3",
            "name": "Bailey",
            "age": "1"
        }
    ],
    "removed": [
        {
            "id": "2",
            "name": "Pancakes",
            "age": "2"
        }
    ],
    "changed": [
        {
            "key": "1",
            "changes": {
                "age": [
                    "4",
                    "5"
                ]
            }
        }
    ],
    "columns_added": [],
    "columns_removed": []
}

添加模板化附加信息

您可以使用 --extra 选项指定要在易读格式中显示的附加键

--extra name "Python format string with {id} for variables"

例如,要为每个带有 ID 的项目输出链接 https://news.ycombinator.com/latest?id={id},您可以使用此方法

csv-diff one.csv two.csv --key=id \
  --extra latest "https://news.ycombinator.com/latest?id={id}"

这些附加信息会显示类似这样的内容

"25" numComments: "5" => "6" extras: latest: https://news.ycombinator.com/latest?id=41459472">
1 row changed

  id: 41459472
    points: "24" => "25"
    numComments: "5" => "6"
  extras:
    latest: https://news.ycombinator.com/latest?id=41459472

作为 Python 库使用

您也可以将此 Python 库导入到您自己的代码中,如下所示

from csv_diff import load_csv, compare
diff = compare(
    load_csv(open("one.csv"), key="id"),
    load_csv(open("two.csv"), key="id")
)

现在,diff 将包含与上面 --json 示例中的输出相同的数据结构。

如果 CSV 中的列已更改,则在计算特定行的更改时,将忽略添加或删除的列。

作为 Docker 容器使用

构建镜像

$ docker build -t csvdiff .

运行容器

$ docker run --rm -v $(pwd):/files csvdiff

假设当前目录包含两个 csv 文件:one.csv two.csv

$ docker run --rm -v $(pwd):/files csvdiff one.csv two.csv

替代方案

  • csvdiff 是一个“用于比较 CSV 文件的快速差异工具”——对于更大的文件,您可能会从它那里获得比 csv-diff 更好的结果。