当前位置:首页>python>【Python计算生态】csvkit——CSV文件处理库

【Python计算生态】csvkit——CSV文件处理库

  • 2026-10-21 13:30:27
【Python计算生态】csvkit——CSV文件处理库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取:
https://github.com/returu/Python_Ecosystem
01
简介:
csvkit是一个强大的 Python第三方库,专门用于处理 CSV 文件。它提供了一组命令行工具能够高效地完成 CSV 文件的读取、写入、转换、筛选、统计等操作。
直接使用pip安装:
pip install csvkit
如果需要处理带有 .zst 扩展名的Zstandard文件,需安装Zstandard支持:
pip install csvkit[zstandard]
GitHub页面:
https://github.com/wireservice/csvkit
02
使用:

csvkit 提供了一系列命令行工具用于处理CSV文件:

  • in2csv:将 Excel 等其他格式文件转换为 CSV。

  • csvlook:以表格形式在终端中查看 CSV 文件。

  • csvcut:用于选择特定列。

  • csvstat:生成数据的统计信息。

  • csvgrep:根据条件筛选行。
  • csvsort:对数据进行排序。
  • csvjoin:通过指定列连接多个 CSV 文件。
  • csvstack:将多个结构相同(列名和列顺序一致)的 CSV 文件垂直堆叠(即按行合并)
  • csvsql/sql2csv:用于在 CSV 文件和 SQL 数据库之间进行数据的转换和操作。
  • csvjson:将 CSV文件转换为 JSON 格式。
    csvpy:启动一个 Python 交互式环境,进行数据操作。

需要注意的是,因为 csvkit 的所有工具默认都写入终端输出(标准输出),因此需要使用 > 语法,将标准输出重定向到文件。

  • 查看数据:

  • in2csv:

in2csv 可以将多种常见文件格式转换为 CSV,包括 .xls 和 .xlsx Excel 文件、JSON 文件以及固定宽度格式的文件。

转换后可以通过使用cat(Unix/Linux/macOS)或者type/more(Windows)命令打印内容来验证数据是否已保存到新文件:

# 将 Excel 格式数据转换为 CSV 格式>>> in2csv ne_1033_data.xlsx > data.csv>>>type data.csv# 输出:# state,county,fips,nsn,item_name,quantity,ui,acquisition_cost,total_cost,ship_date,federal_supply_category,federal_supply_category_name,federal_supply_class,federal_supply_class_name# NE,ADAMS,31001.0,1005-00-589-1271,"RIFLE,7.62 MILLIMETER",1.0,Each,138.0,138.0,2008-07-11,10.0,WEAPONS,1005.0,"Guns, through 30 mm"# ............
  • csvlook:

用于以表格形式在终端中查看 CSV 文件,使数据更易读。

当数据集有许多列时,默认情况下无法全部在终端中显示。因此csvlook 的输出看起来可能并不理想,会看到一堆数据、竖线字符和破折号。此时,可以将输出通过管道传输到 less -S ,以不换行的方式显示行,并使用箭头键左右滚动。需要注意的是,less 是一个类 Unix系统(如 Linux、macOS)中的命令行工具。

# 将 Excel 格式数据转换为 CSV 格式>>> svlook data.csv# 输出:| state | county     |   fips | nsn              | item_name                                                      | quantity | ui      | acquisition_cost | total_cost |  ship_date | federal_supply_category | federal_supply_category_name        | federal_supply_class | federal_supply_class_name                                       || ----- | ---------- | ------ | ---------------- | -------------------------------------------------------------- | -------- | ------- | ---------------- | ---------- | ---------- | ----------------------- | ----------------------------------- | -------------------- | --------------------------------------------------------------- || NE    | ADAMS      | 31,001 | 1005-00-589-1271 | RIFLE,7.62 MILLIMETER                                          |        1 | Each    |           138.00 |     138.00 | 2008-07-11 |                      10 | WEAPONS                             |                1,005 | Guns, through 30 mm
  •  csvcut:

用于选择、删除和重新排序 CSV 中的列。

# 查看数据中有哪些列>>> csvcut -n data.csv  1: state  2: county  3: fips  4: nsn  5: item_name  6: quantity  7: ui  8: acquisition_cost  9: total_cost 10: ship_date 11: federal_supply_category 12: federal_supply_category_name 13: federal_supply_class 14: federal_supply_class_name# 只查看第 2、5 和 6 列>>> csvcut -c 2,5,6 data.csvcounty,item_name,quantityADAMS,"RIFLE,7.62 MILLIMETER",1.0ADAMS,"RIFLE,7.62 MILLIMETER",1.0ADAMS,"RIFLE,7.62 MILLIMETER",1.0ADAMS,"RIFLE,7.62 MILLIMETER",1.0ADAMS,"RIFLE,7.62 MILLIMETER",1.0ADAMS,"RIFLE,7.62 MILLIMETER",1.0# 也可以通过列名来引用列>>> csvcut -c county,item_name,quantity data.csv
  • 通过管道组合使用:

除了指定文件名外,csvkit 的所有工具都通过“标准输入”接受输入文件。这意味着,使用 |(“管道”)字符,可以将一个 csvkit 工具的输出作为下一个工具的输入。通过这种方式,形成了一个数据处理“管道”,而无需创建若干个中间文件。

# 通过管道组合使用>>> in2csv ne_1033_data.xlsx | csvcut -c county,item_name,quantity | csvlook
  • 检查数据:
  • csvstat:

为 CSV 文件中的所有数据生成摘要统计信息。csvstat 会推断每列的数据类型,然后对其执行基本统计分析。具体计算的统计信息取决于列的类型(数字、文本、日期等)。

# 查看数据集中前两列的摘要统计信息>>> csvcut -c 1,2 data.csv | csvstat# 输出:  1. "state"        Type of data:          Text        Contains null values:  False        Non-null values:       1036        Unique values:         1        Longest value:         2 characters        Most common values:    NE (1036x)  2. "county"        Type of data:          Text        Contains null values:  False        Non-null values:       1036        Unique values:         35        Longest value:         10 characters        Most common values:    DOUGLAS (760x)                               DAKOTA (42x)                               CASS (37x)                               HALL (23x)                               LANCASTER (18x)Row count: 1036
  • csvgrep:

用于过滤 CSV 文件中的行,根据指定的条件筛选出符合要求的数据。

其中,-m 参数表示“匹配”,它会在给定列(-c参数指定)中查找任何位置的文本。另外,还支持使用 -r 来搜索正则表达式。

# 使用 csvgrep 在行中搜索州的名称、使用 csvcut 查看指定列、使用 csvlook 格式化输出>>> csvgrep -c county -m LANCASTER data.csv |csvcut -c 1,2,3 | csvlook# 输出:| state | county    |   fips || ----- | --------- | ------ || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 || NE    | LANCASTER | 31,109 |
  • csvsort:

根据 CSV 文件中的一个或多个列对数据行进行排序。排序可以是升序(默认),也可以指定为降序(-r参数)。

# 使用 csvsort 按照 total_cost 列对行进行排序,顺序为反向(降序)、使用 csvcut 查看指定列、使用 csvlook 格式化输出>>> csvsort -c total_cost -r data.csv | csvcut -c 1,2,3 | csvlook# 输出:| state | county     |   fips || ----- | ---------- | ------ || NE    | LANCASTER  | 31,109 || NE    | SARPY      | 31,153 || NE    | DOUGLAS    | 31,055 || NE    | KIMBALL    | 31,105 |
  • 高级工具:

  • csvjoin:

将多个 CSV 文件根据指定的列进行连接操作,类似于 SQL 中的 JOIN 操作,可帮助你整合不同数据源的数据。

常用命令参数:
  • -c、COLUMNS:要连接的列名。或者是一个逗号分隔的列名列表,顺序与 指定文件的顺序相同。如果未指定,两个文件将按顺序连接,不会匹配。
  • -j, --left:执行左连接操作,即保留左表中的所有行,即使右表中没有匹配的行。

  • -r, --right:执行右连接操作,保留右表中的所有行,即使左表中没有匹配的行。

  • -o, --outer:执行全外连接操作,保留两个表中的所有行。

# 通过 fips 列,对两个 CSV 文件进行连接操作>>> csvjoin -c fips data.csv acs2012_5yr_population.csv > joined.csv
  • csvstack:
用于将多个结构相同(列名和列顺序一致)的 CSV 文件垂直堆叠(即按行合并)。它非常适合将多个 CSV 文件合并为一个文件,尤其是在处理分块数据或来自不同来源的相似数据时。
通过 -g 参数,csvstack 还可以为每一行添加一个“分组列”,以便区分每一行来自哪个文件。
# 将两个 CSV 文件垂直堆叠(按行合并)>>> csvstack ne_1033_data.csv ks_1033_data.csv > region.csv
  • 数据迁移:
  • csvsql/sql2csv:
用于在 CSV 文件和 SQL 数据库之间进行数据的转换和操作。
默认情况下,csvsql会为数据生成一个CREATE TABLE语句。可以使用-i参数指定使用的数据库类型:
>>> csvsql -i sqlite joined.csv
使用 -db参数(指定数据库连接字符串)和 - insert参数(将 CSV 文件的数据插入到指定的数据库表中)将csv文件导入到数据库:
>>> csvsql --db sqlite:///leso.db --insert joined.csv
使用 sql2csv 执行 SQL 查询,并将查询结果以 CSV 格式输出。--query 参数接受任何 SQL 查询。
>>> sql2csv --db sqlite:///leso.db --query "SELECT * FROM joined WHERE county='DOUGLAS';" > douglas.csv
  • csvjson:
将 CSV(逗号分隔值)文件转换为更适合 Web 应用或 API 使用的 JSON 格式。其中,--indent 参数用于指定 JSON 输出的缩进空格数,用于美化 JSON 格式,使输出更易读。
另外,通过--lat 和 --lon参数指定经纬度列名,可以将 CSV 数据转换为 GeoJSON 格式。
>>> csvcut -c county,item_name data.csv | csvgrep -c county -m "GREELEY" | csvjson --indent 4# 输出:[    {"county": "GREELEY","item_name": "RIFLE,7.62 MILLIMETER"    },    {"county": "GREELEY","item_name": "RIFLE,7.62 MILLIMETER"    },    {"county": "GREELEY","item_name": "RIFLE,7.62 MILLIMETER"    }]
  • csvpy:

csvpy提供了一种交互式的方式来处理和分析 CSV 文件。

运行该命令后,会启动一个 Python 交互式环境,同时会把指定的 CSV 文件加载进来,可以直接对其中的数据进行操作。

>>> csvpy data.csvWelcome! "data.csv" has been loaded in a reader object named "reader".>>> print(len(list(reader)))1037>>> quit()

更多内容可以前往官方文档查看:

https://csvkit.readthedocs.io/en/latest/

最新文章

随机文章