Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。
本系列将会陆续整理分享一些有趣、有用的第三方库。
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
https://github.com/returu/Python_Ecosystem
csvkit是一个强大的 Python第三方库,专门用于处理 CSV 文件。它提供了一组命令行工具能够高效地完成 CSV 文件的读取、写入、转换、筛选、统计等操作。如果需要处理带有 .zst 扩展名的Zstandard文件,需安装Zstandard支持:pip install csvkit[zstandard]
https://github.com/wireservice/csvkit
csvkit 提供了一系列命令行工具用于处理CSV文件:
需要注意的是,因为 csvkit 的所有工具默认都写入终端输出(标准输出),因此需要使用 > 语法,将标准输出重定向到文件。
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"# ............
用于以表格形式在终端中查看 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
用于选择、删除和重新排序 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
为 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
用于过滤 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 |
根据 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 |
将多个 CSV 文件根据指定的列进行连接操作,类似于 SQL 中的 JOIN 操作,可帮助你整合不同数据源的数据。
- -c、COLUMNS:要连接的列名。或者是一个逗号分隔的列名列表,顺序与 指定文件的顺序相同。如果未指定,两个文件将按顺序连接,不会匹配。
-j, --left:执行左连接操作,即保留左表中的所有行,即使右表中没有匹配的行。
-r, --right:执行右连接操作,保留右表中的所有行,即使左表中没有匹配的行。
-o, --outer:执行全外连接操作,保留两个表中的所有行。
# 通过 fips 列,对两个 CSV 文件进行连接操作>>> csvjoin -c fips data.csv acs2012_5yr_population.csv > joined.csv
用于将多个结构相同(列名和列顺序一致)的 CSV 文件垂直堆叠(即按行合并)。它非常适合将多个 CSV 文件合并为一个文件,尤其是在处理分块数据或来自不同来源的相似数据时。通过 -g 参数,csvstack 还可以为每一行添加一个“分组列”,以便区分每一行来自哪个文件。# 将两个 CSV 文件垂直堆叠(按行合并)>>> csvstack ne_1033_data.csv ks_1033_data.csv > region.csv
用于在 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
将 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提供了一种交互式的方式来处理和分析 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/