page contents

别再重复造轮子了!Python这10个内置模块真能造!

里面有手写路径拼接、手写分组、手写重试、手写命令行参数解析,还有一个自己封装的日志类。我第一眼就不太信这种文件,越像“万能工具箱”,越容易藏坑。

attachments-2026-07-XNnbAZiO6a4866cec5731.png

项目里又看到一个 utils.py,两千多行。

里面有手写路径拼接、手写分组、手写重试、手写命令行参数解析,还有一个自己封装的日志类。我第一眼就不太信这种文件,越像“万能工具箱”,越容易藏坑。

Python 标准库里很多东西不是不能用,是平时被忽略了。

先看一个很常见的活:每天把一批订单 CSV 扫一遍,过滤脏数据,按用户聚合金额,最后输出异常日志。

很多人会先造一堆函数,其实用几个内置模块就够了。

from pathlib import Path
from collections import defaultdict
from dataclasses import dataclass
from datetime import datetime
import csv
import logging

logging.basicConfig(
    filename="check_order.log",
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s"
)

@dataclass
class OrderLine:
    user_id: str
    order_id: str
    amount: int
    pay_time: datetime

def load_orders(src_dir: str):
    root = Path(src_dir)

    for file in root.glob("order_*.csv"):
        with file.open("r", encoding="utf-8", newline="") as f:
            for row in csv.DictReader(f):
                try:
                    yield OrderLine(
                        user_id=row["user_id"].strip(),
                        order_id=row["order_id"].strip(),
                        amount=int(row["amount"]),
                        pay_time=datetime.strptime(row["pay_time"], "%Y-%m-%d %H:%M:%S")
                    )
                except Exception as e:
                    logging.info("bad row file=%s row=%s err=%s", file.name, row, e)

money_by_user = defaultdict(int)

for item in load_orders("./data"):
    money_by_user[item.user_id] += item.amount

for user_id, total in money_by_user.items():
    if total > 100000:
        logging.info("large user user_id=%s total=%s", user_id, total)

这里面已经用了 6 个模块。

pathlib 处理路径,别再 "./data/" + file_name 这么拼了。Windows、Linux 路径分隔符不一样,迟早被环境恶心一次。

csv 读表格,比自己 split(",") 靠谱。字段里带逗号、引号、换行时,手写解析基本就是埋雷。

dataclasses 适合放这种临时业务对象。不是所有东西都要上 Pydantic,也不是所有对象都要手写 __init__。

datetime 不只是拿当前时间,更多时候是把字符串变成真正能比较、能计算的时间。

collections.defaultdict 用来分组、计数、聚合,比到处写:

if key not in result:
    result[key] = 0
result[key] += value

清爽太多。

logging 就更不用说了。线上脚本最怕只会 print,跑完啥也没留下。尤其是定时任务,失败一次没人看见,第二天数据就对不上。

再说几个我平时用得很顺手的。

itertools 适合处理批量数据。比如接口一次最多查 200 个订单,别自己写一堆下标判断。

from itertools import islice

def chunked(items, size):
    it = iter(items)
    while batch := list(islice(it, size)):
        yield batch

order_ids = ["A1001", "A1002", "A1003", "A1004"]

for batch in chunked(order_ids, 2):
    print("call remote api:", batch)

这个代码短,但比很多“分页工具类”稳。

functools 我一般拿来做两件事:缓存和保留函数上下文。

比如某个配置文件一天读不了几次,但代码里到处要用:

from functools import lru_cache
import json
from pathlib import Path

@lru_cache(maxsize=1)
def get_rule_config():
    text = Path("./rule.json").read_text(encoding="utf-8")
    return json.loads(text)

def check_channel(channel):
    rules = get_rule_config()
    return channel in rules.get("enabled_channels", [])

这里顺手也用了 json。别小看它,接口落盘、配置读取、排障时格式化响应,基本天天碰。

argparse 是很多脚本最该用、但最容易被偷懒跳过的模块。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--day", required=True, help="账单日期,例如 2026-06-01")
parser.add_argument("--dry-run", action="store_true")
args = parser.parse_args()

print(args.day, args.dry_run)

有了它,脚本就不是只能改源码才能跑了。这个差别挺大,尤其是交给运维或者放到流水线里执行时。

最后一个,subprocess。

它不是让你乱调 shell,而是当 Python 必须跟系统命令配合时,别再用 os.system() 糊。

import subprocess

ret = subprocess.run(
    ["grep", "-c", "TimeoutError", "app.log"],
    text=True,
    capture_output=True
)

if ret.returncode == 0:
    print("timeout count:", ret.stdout.strip())
else:
    print("grep failed:", ret.stderr)

os.system() 只能拿个退出码,标准输出、错误输出都不好处理。排障脚本里这个很烦。

这 10 个模块我再拎一下:

pathlib、csv、dataclasses、datetime、collections、logging、itertools、functools、argparse、subprocess。

它们不花哨,也不新。

但很多项目里的“公共工具类”,拆开看就是把这些模块又写了一遍,而且写得还不如标准库边界清楚。

我现在看 Python 脚本,第一眼不是看用了什么高级库,而是看有没有乱造轮子。

路径手拼,日志靠 print,参数靠改源码,分组靠一堆 if key not in dict。

这种代码能跑。

但一上定时任务、一接真实数据、一换机器,毛病就开始出来了。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2187 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 2187 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章