python 格式化输出详解(占位符:%、format、f表达式)——下篇 实例篇

作者自我介绍:大爽歌, b站小UP主,直播编程+红警三,python1对1辅导老师。
上篇: python 格式化输出详解(占位符:%、format、f表达式)—— 理论篇
本文为下篇: python 格式化输出详解(占位符:%、format、f表达式)—— 实例篇

格式化输出内容为markdown表格格式 —— 使用f表达式

markdown表格语法如下

|  表头   | 表头  |
|  ----  | ----  |
| 单元格  | 单元格 |
| 单元格  | 单元格 | 

其表现效果则为

表头表头
单元格单元格
单元格单元格
详情描述:

有表头内容和单元格内容,均为列表,要输出成markdwon语法格式,同时希望输出内容本身能够尽可能对齐。

补充:中文对齐,尝试使用两格位置来对其,如果中文占位不是两格则对不起。

由于每个内容的对齐长度是存放在变量里的,所以这个场景最适合使用f表达式。

代码如下:

# require: python3.6 or above
def count_width(s, align_zh):
    s = str(s)

    count = 0
    for ch in s:
        if align_zh and u'\u4e00' <= ch <= u'\u9fff':  # 中文占两格
            count += 2
        else:
            count += 1

    return count


def print_to_markdwon_table(column, rows, align_zh = False):

    widths = []
    column_str = ""
    separate = "----"
    separate_str = ""
    # 计算每一列的宽度:最长字段
    for ci, cname  in enumerate(column):
        cw = count_width(cname, align_zh)
        for row in rows:
            item = row[ci]

            if count_width(item, align_zh) > cw:
                cw = count_width(item, align_zh)

        widths.append(cw)

        delete_count = count_width(cname, align_zh) - count_width(cname, False)

        column_str += f'|{cname:^{cw-delete_count+2}}'
        separate_str += f'|{separate:^{cw+2}}'

    column_str += "|"
    separate_str += "|"

    print(column_str)
    print(separate_str)

    for ri, row in enumerate(rows):
        row_str = ""
        for ci, item in enumerate(row):
            cw = widths[ci]

            delete_count = count_width(item, align_zh) - count_width(item, False)
            row_str += f'|{item:^{cw-delete_count+2}}'

        row_str += "|"
        print(row_str)

举例如下
example 1: 上篇中用到的表格

column = ["`conversion`", "说明" , "示例", "输出"]
rows = [
    ["`s`", "对结果调用`str()`方法" , '`f"His name is {name!s}."`', """`'His name is Ståle.'`"""],
    ["`r`", "对结果调用`repr()`方法" , '`f"His name is {name!r}."`', """`"His name is 'Ståle'."`"""],
    ["`a`", "对结果调用`ascii()`方法" , '`f"His name is {name!a}."`', """`"His name is 'St\\xe5le'."`"""],
]

print_to_markdwon_table(column, rows)

其输出内容为

| `conversion` |        说明        |             示例             |             输出              |
|     ----     |       ----       |            ----            |            ----             |
|     `s`      |  对结果调用`str()`方法  | `f"His name is {name!s}."` |   `'His name is Ståle.'`    |
|     `r`      | 对结果调用`repr()`方法  | `f"His name is {name!r}."` |  `"His name is 'Ståle'."`   |
|     `a`      | 对结果调用`ascii()`方法 | `f"His name is {name!a}."` | `"His name is 'St\xe5le'."` |

展示效果为:

conversion说明示例输出
s对结果调用str()方法f"His name is {name!s}."'His name is Ståle.'
r对结果调用repr()方法f"His name is {name!r}.""His name is 'Ståle'."
a对结果调用ascii()方法f"His name is {name!a}.""His name is 'St\xe5le'."

example 2: 数据库内容展示

column = ["id", "name", "sex", "age"]

rows = [
    [0, 'Li Hua', 'male', 20], 
    [1, 'Big Shuang', 'male', 24], 
    [2, 'Xiao Hong', 'female', 21], 
    [3, 'Xiao Hua', 'female', 19], 
    [4, 'Ellen', 'female', 20], 
    [5, 'Zhang Sirui', 'female', 22], 
    [6, 'Alex', 'male', 23], 
    [7, 'Zhao Wen', 'female', 24], 
    [8, 'Sun Wu', 'male', 18], 
    [9, 'Qian Kong', 'male', 22]
]

print_to_markdwon_table(column, rows)

其输出内容为

| id |    name     |  sex   | age |
|----|    ----     |  ----  |---- |
| 0  |   Li Hua    |  male  | 20  |
| 1  | Big Shuang  |  male  | 24  |
| 2  |  Xiao Hong  | female | 21  |
| 3  |  Xiao Hua   | female | 19  |
| 4  |    Ellen    | female | 20  |
| 5  | Zhang Sirui | female | 22  |
| 6  |    Alex     |  male  | 23  |
| 7  |  Zhao Wen   | female | 24  |
| 8  |   Sun Wu    |  male  | 18  |
| 9  |  Qian Kong  |  male  | 22  |

展示效果为:

idnamesexage
0Li Huamale20
1Big Shuangmale24
2Xiao Hongfemale21
3Xiao Huafemale19
4Ellenfemale20
5Zhang Siruifemale22
6Alexmale23
7Zhao Wenfemale24
8Sun Wumale18
9Qian Kongmale22
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值