跳转到主要内容

Python CLI工具和库,用于比较CSV和JSON文件

项目描述

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可以显示文件之间差异的易读摘要

$ 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对象数组。如果您的输入文件是JSON,请使用--format=json

使用--show-unchanged包括至少有一个更改的行的未更改值的完整详细信息

% 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}"

这些附加键显示如下

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相比,您可能从该工具中获得更好的结果,特别是对于较大的文件。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

csv_diff-1.2.tar.gz (11.9 kB 查看哈希)

上传时间

构建分布

csv_diff-1.2-py3-none-any.whl (13.6 kB 查看哈希)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面