普贤教程 › 生态包
文本与中文
18 个文本与中文处理包:终端着色、进度条、表格、中文拼音/分词/简繁、数字转中文、自然排序、字符串距离。写 CLI 工具与后台报表时几乎天天用到。
表格:必须用 v2
px
import table var rows = [["中文", "abc"], ["第二行", "defgh"]] print(tb_render_v2(["列一", "列二"], rows, {"border": "utf8"}))
text
+--------+-------+ | 列一 | 列二 | +--------+-------+ | 中文 | abc | | 第二行 | defgh | +--------+-------+
tb_render 和 tb_render_v2 的区别是中文宽度v1 按 len() 算列宽(一个汉字算 1),中文行会错位;v2 按显示宽度算(汉字算 2)。只写 v2,v1 保留只是为了不破坏旧代码。中文三件套
px
import pinyin print(py_convert("中国")) # zhong guo ← 字级,空格分隔,不做分词 print(py_lookup("中").ok()) # zhong print(py_convert_list("你好").ok())# [{ch: 你, py: ni}, {ch: 好, py: hao}] import cnnum print(cnnum_format(12345).ok()) # 一万二千三百四十五 print(cnnum_parse("一万二千三百四十五").ok()) # 12345 print(cnnum_amount_str("1234.56").ok()) # 壹仟贰佰叁拾肆元伍角陆分 import seg print(sg_count("中华人民共和国")) # 词数 print(sg_tokenize("中华人民共和国"))
超范围返回 Err,
.ok() 得 nullcnnum_format 只支持 0–99,999,999;传 123456789 返回 Err(cnnum: 超出 0-99999999 范围),而 .ok() 给你 null——页面上就显示空。金额走 cnnum_amount_str(支持到万亿)。人类可读格式化
px
import human print(hm_filesize(1536)) # 1.5KB print(hm_filesize(1048576)) # 1MB print(hm_number(1234567)) # 1.2M import num2words print(nw_convert(123)) # one hundred twenty-three import thousep print(th_thousands(1234567)) # 1,234,567 print(th_ordinal(21)) # 21st print(th_bytes(1536)) # 1.5 KB
区分用途:human 给终端看(1.5KB 无空格),thousep 给报表看(1,234,567 千分位 + 序数 + 紧凑写法)。
命令行
px
import cli var spec = { "name": "deploy", "flags": [ {"long": "env", "short": "e", "type": "str", "default": "prod"}, {"long": "dry-run", "short": "n", "type": "bool"}, {"long": "port", "short": "p", "type": "int"} ] } var r = cli_parse(spec, argv) # argv 由你传入 print(r)
支持长短选项、= 与空格两种赋值、布尔开关、类型转换(str/int/float/bool)与错误文案。--help 的生成也走它。
CLI 的 argv 从哪来用
argv(内建,不含程序名)或 args(),别去读 env("ARGS")。终端输出
px
import ansi print(an_style("危险", "bold") + an_reset()) print(an_fg("红字", 31) + an_reset()) print(an_strip(s)) # 去掉 ANSI 转义,写日志/文件前必须先 strip import progress print(pg_bar(37, 100)) # 进度条渲染
写文件前一定
an_strip颜色是给终端看的;把带转义符的字符串写进日志文件或 HTML,会看到一堆 \x1b[31m。其余文本工具
| 包 | 干什么 |
|---|---|
strcase | snake / camel / kebab 互转 |
slug | 标题 → URL slug(可配中文拼音) |
hant | 简繁转换(常用字子集) |
natsort | 自然排序:file2 在 file10 前 |
textwrap | 按宽度折行(中文按显示宽度) |
edist | 编辑距离 / 相似度(拼写纠错、模糊匹配) |
readstat | 可读性测度(句长、词长、难度分) |
inflect | 英文复数化(box → boxes) |
faker | 假数据:姓名、手机、邮箱、地址(测试夹具用) |
richmd | Markdown → ANSI 富文本(终端里渲染 MD) |
生成假数据
px
import faker
print(fa_name())
print(fa_phone())
print(fa_email())写测试时先把假数据钉死(固定种子或直接写死数组),否则「今天过、明天挂」的测试会浪费很多时间。