Python 常用模块:别从头造轮子,这些内置的和第三方的直接拿来用
Python 最值钱的东西就是它的生态——标准库加上 PyPI 上几十万的第三方包,几乎覆盖了你可能遇到的所有需求。
写代码的时候,遇到问题第一反应不应该是"自己怎么实现",而是"有没有现成的模块可以用"。
文件和路径:os、sys、pathlib
os:跟操作系统打交道
importos# 路径拼接(跨平台)path=os.path.join("data","logs","app.log")# data/logs/app.log# 获取当前目录os.getcwd()# 创建目录(存在也不报错)os.makedirs("data/logs",exist_ok=True)# 判断文件/目录是否存在os.path.exists("data.txt")os.path.isfile("data.txt")os.path.isdir("data")# 列出目录内容os.listdir(".")# 删除文件os.remove("temp.txt")# 环境变量os.environ.get("PATH")sys:控制 Python 解释器
importsys# 命令行参数# python script.py --name Alicesys.argv# ['script.py', '--name', 'Alice']# 程序退出sys.exit(1)# 非0表示异常# Python 版本检查ifsys.version_info<(3,8):print("需要 Python 3.8+")sys.exit(1)# 模块搜索路径sys.path sys.path.append("/my/custom/path")# 平台信息sys.platform# 'linux', 'win32', 'darwin'pathlib:面向对象的路径操作(推荐)
frompathlibimportPath# 创建路径p=Path("/home/user/data/file.txt")home=Path.home()current=Path.cwd()# 路径属性p.name# 'file.txt'p.stem# 'file'p.suffix# '.txt'p.parent# '/home/user/data'# 拼接(用 / 运算符)path=Path("data")/"logs"/"app.log"# 读写文件(一行搞定)Path("data.txt").write_text("Hello",encoding="utf-8")content=Path("data.txt").read_text(encoding="utf-8")# 遍历文件forfileinPath(".").glob("*.py"):print(file)# 递归遍历forfileinPath(".").rglob("*.txt"):print(file)# 创建目录Path("data/logs").mkdir(parents=True,exist_ok=True)# 判断存在ifPath("data.txt").exists():Path("data.txt").unlink()# 删除os还是pathlib?pathlib是新代码的推荐选择,更直观、跨平台更好。老代码里os.path也很常见,两种都认识就行。
日期时间:datetime
fromdatetimeimportdatetime,date,timedelta# 获取当前时间now=datetime.now()today=date.today()# 格式化输出now.strftime("%Y-%m-%d %H:%M:%S")# '2026-07-02 10:30:00'now.strftime("%Y年%m月%d日")# '2026年07月02日'# 字符串转 datetimedt=datetime.strptime("2026-07-02 10:30:00","%Y-%m-%d %H:%M:%S")# 时间计算tomorrow=now+timedelta(days=1)next_week=now+timedelta(weeks=1)yesterday=now-timedelta(days=1)# 时间差delta=datetime(2026,12,31)-datetime(2026,1,1)delta.days# 364# 时间戳timestamp=now.timestamp()datetime.fromtimestamp(timestamp)日期格式符记住%Y-%m-%d %H:%M:%S就够了,其他格式遇到再查。
JSON 处理:json
import json data = {"name": "张三", "age": 25, "active": True} # 字典 → JSON 字符串 json_str = json.dumps(data, ensure_ascii=False, indent=2) # { # "name": "张三", # "age": 25, # "active": true # } # JSON 字符串 → 字典 parsed = json.loads('{"name": "张三", "age": 25}') # 读写文件 with open("data.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) with open("data.json", "r", encoding="utf-8") as f: data = json.load(f)记住两个参数:ensure_ascii=False保留中文,indent=2让输出可读。
正则表达式:re
常用函数就四个:search(找一个)、findall(找所有)、sub(替换)、split(分割)。
importre text="联系我:13812345678 或 email@test.com"# 找第一个match=re.search(r"1[3-9]\d{9}",text)ifmatch:print(match.group())# '13812345678'# 找所有re.findall(r"1[3-9]\d{9}",text)# ['13812345678']# 找所有 + 捕获组match=re.search(r"(\w+)@(\w+\.\w+)",text)match.group(1)# 'email'match.group(2)# 'test.com'# 替换re.sub(r"1[3-9]\d{9}","***",text)# '联系我:*** 或 email@test.com'# 预编译(多次使用时提升性能)pattern=re.compile(r"1[3-9]\d{9}")pattern.findall(text)常用正则速查:
| 需求 | 正则 |
|---|---|
| 手机号 | 1[3-9]\d{9} |
| 邮箱 | \w+@\w+\.\w+ |
| URL | https?://[^\s]+ |
| 数字 | \d+ |
| 中文 | [\u4e00-\u9fa5]+ |
高级数据结构:collections
defaultdict:不存在的键自动给默认值
fromcollectionsimportdefaultdict# 默认值是列表dd=defaultdict(list)dd["fruits"].append("apple")# 不会报 KeyErrordd["fruits"]# ['apple']# 默认值是数字 0dd_int=defaultdict(int)dd_int["count"]+=1# 1Counter:计数神器
fromcollectionsimportCounter words=["apple","banana","apple","orange","apple","banana"]counter=Counter(words)# Counter({'apple': 3, 'banana': 2, 'orange': 1})counter.most_common(2)# [('apple', 3), ('banana', 2)]counter["apple"]# 3counter["grape"]# 0(不存在的返回0,不报错)deque:两端操作 O(1)
fromcollectionsimportdeque dq=deque([1,2,3])dq.append(4)# 右边加dq.appendleft(0)# 左边加dq.pop()# 右边删dq.popleft()# 左边删# 固定长度,满了自动挤掉旧的dq=deque(maxlen=3)foriinrange(5):dq.append(i)# deque([2, 3, 4], maxlen=3)迭代器工具:itertools
product:多层循环替代品
fromitertoolsimportproduct colors=["红","蓝"]sizes=["S","M","L"]# 替代嵌套 forforc,sinproduct(colors,sizes):print(f"{c}{s}")# 红S, 红M, 红L, 蓝S, 蓝M, 蓝Lpermutations和combinations:排列组合
fromitertoolsimportpermutations,combinationslist(permutations([1,2,3],2))# 排列,有序list(combinations([1,2,3,4],2))# 组合,无序不重复chain:串联多个列表
fromitertoolsimportchainlist(chain([1,2],[3,4],[5,6]))# [1, 2, 3, 4, 5, 6]缓存和偏函数:functools
lru_cache:函数结果缓存
fromfunctoolsimportlru_cache@lru_cache(maxsize=128)deffib(n):ifn<2:returnnreturnfib(n-1)+fib(n-2)fib(40)# 第一次慢,之后直接从缓存取fib.cache_info()# 查看缓存命中情况partial:固定部分参数,生成新函数
fromfunctoolsimportpartialdefpower(base,exponent):returnbase**exponent square=partial(power,exponent=2)cube=partial(power,exponent=3)square(5)# 25cube(5)# 125日志:logging
importlogging# 基础配置logging.basicConfig(level=logging.INFO,format="%(asctime)s - %(levelname)s - %(message)s",handlers=[logging.FileHandler("app.log"),logging.StreamHandler()])logger=logging.getLogger(__name__)logger.debug("调试")logger.info("信息")logger.warning("警告")logger.error("错误")logger.critical("严重")# 记录异常堆栈try:1/0exceptException:logger.exception("发生异常")HTTP 请求:requests(第三方)
importrequests# GET 请求resp=requests.get("https://api.github.com")resp.status_code# 200resp.json()# 解析 JSON# GET 带参数resp=requests.get("https://api.github.com/search/repositories",params={"q":"python","page":1})# POST JSONresp=requests.post("https://httpbin.org/post",json={"username":"alice","password":"secret"})# 错误处理try:resp=requests.get("https://api.example.com",timeout=5)resp.raise_for_status()# 4xx/5xx 抛异常exceptrequests.exceptions.Timeout:print("超时")exceptrequests.exceptions.ConnectionError:print("连接失败")session 保持登录状态:
session=requests.Session()session.post("https://example.com/login",data={"user":"alice","pass":"123"})# 后续请求自动带 cookiesprofile=session.get("https://example.com/profile")数据分析三件套:pandas、numpy、matplotlib
pandas:处理表格数据
importpandasaspd# 读 CSV / Exceldf=pd.read_csv("data.csv")df=pd.read_excel("data.xlsx")# 看一眼数据df.head()df.info()df.describe()# 筛选df[df["age"]>25]df[(df["age"]>25)&(df["score"]>85)]# 分组聚合df.groupby("city")["score"].mean()# 写回文件df.to_csv("output.csv",index=False)numpy:数值计算
importnumpyasnp arr=np.array([1,2,3,4,5])arr.mean()# 3.0arr.sum()# 15arr.max()# 5arr[arr>2]# 条件筛选 [3, 4, 5]# 创建数组np.zeros((3,4))# 3x4 全0np.ones((2,3))# 2x3 全1np.arange(0,10,2)# [0, 2, 4, 6, 8]np.random.rand(3,3)# 3x3 随机数matplotlib:画图
importmatplotlib.pyplotaspltimportnumpyasnp x=np.linspace(0,10,100)y=np.sin(x)plt.plot(x,y)plt.xlabel("X")plt.ylabel("Y")plt.title("正弦曲线")plt.show()