拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Python常用库速查:文件、数据、正则、请求实战模板

行吧聊点实在的。这是《99天精通Python》系列的第96天按计划这阶段不该再啃大块新知识了而是要把过去三个多月用过、搜过、抄过的东西沉淀成一张能快速翻的速查表。我手里这份Python常用库速查手册与其说是“小抄”不如说是给自己这96天的实战侧写——每个库都不是从官方文档里抄出来的而是在真实需求里反复踩坑、验证、固化下来的固定套路。这份东西涵盖的范围比一般“速查表”要窄一点它不是把所有库罗列一遍而是聚焦日常最常用的文件读写、数据加工、文本处理和网络请求这四个高频战区。这四块跑通了你就能应付大部分日常脚本和自动化任务。对于刚学完基础语法、准备往数据分析或自动化方向走的读者来说这份手册应该是你电脑里“写到一半卡住时能救命”的那个备忘也是检验自己Python水平的一个标尺——能不看文档写出来的才是真的会否则仅仅停留在“见过”。如果你已经把这个系列跟到90多天下面这些代码大概率你都见过或查过如果刚入门也不用焦虑你完全可以先把这套速查结构保存在本地当作Python安装完成、环境配好之后的第一个“常驻参考文件”学到哪块用哪块这比从头啃一遍文档有效率得多。1. 这份小抄的来历它解决的是临门一脚卡壳的问题我先说个真实场景。前几天有个学量化交易策略的朋友来问我pandas里的shift()到底怎么用他想算上一交易日的收盘价差值但一执行就得到一列NaN。他自己也搜过官方文档Docstring写得明明白白可就是解决不了他的困惑。后来我让他先把数据从tushare拉到本地存成CSV然后我把我之前写的一段模板发过去他改了个列名就跑了。这事儿对我的一个很大的触动是学习Python的痛点往往不是不知道某个库存在而是到了“我知道该用什么库、但记不清正确用法”的时候手边缺一张能直接给出可运行模板的纸条。官方文档是“标准答案”但它默认你已经掌握了很多背景刚动手的人读起来会觉得很吃力。这就是我做这份Python常用库速查手册的初衷——把95天里被反复验证过的代码片段整理出来附上最常见的“变态”场景和对应解法让“临门一脚”变成“照抄就行”。它主要服务三类人正在系统学习Python基础语法的读者需要知道学了之后到底能用这些库做什么刚配好VSCode或PyCharm环境、准备写第一个自动化脚本的新手需要一个不容易出错、可以直接跑通的模板需要临时写数据分析、爬虫、文本处理脚本的从业者比如运维、财务、运营希望在三分钟内拿到一个准确、不踩坑的方案。有一说一这才是“速查”该有的状态不是给你一本说明书而是给你一组你信得过、用过很多次、确认问题不大可以直接复制的积木块。下面我从四个最常见的实战场景来把我这套“小抄”完整展开每个场景都会给代码、给理由、给容易踩的坑。2. 文件与数据流通os / glob / pathlib / json / csv 的日常手顺文件处理是所有脚本的基础。不管是做数据清洗、日志分析还是批量重命名你都得先把文件找到、打开、读进来或者写出去。Python里有两派做法传统派用os模块新派用pathlib。我的经验是pathlib更适合日常手写脚本因为代码更短且更符合直觉但在做兼容性处理时os.path仍然不可替代。2.1 路径拼接能别手写字符串就别手写很多人习惯直接写root /data/ filename这在Windows上十有八九会踩反斜杠的坑。pathlib解决这个问题只需要一个除法操作from pathlib import Path base Path(C:/Users/yourname/Projects) # 文件夹不存在也没关系 data_path base / data / raw / sales_2025.csv print(data_path) # 输出: C:\Users\yourname\Projects\data\raw\sales_2025.csv # 要读文件 with open(data_path, r, encodingutf-8) as f: content f.read()原理很简单Path对象重载了/操作符它会自动处理分隔符和路径合法性。这样写的好处不只是省事更在于后续如果你改用相对路径或环境变量只需改一处不用整体替换字符串。注意如果你在处理网络路径或跨平台共享代码os.path.join仍然是更稳妥的老办法因为它历史久、坑少而且第三方库也常用它做路径判断。但自己写脚本我建议优先pathlib一眼就能看懂。2.2 glob三行代码批量找文件有时候你需要“找出目录下所有Excel文件”或者“找出所有带日期标记的日志”这时候glob库是首选。它相当于用正则的思路做文件路径匹配但语法简单得多import glob # 找 D:/data 下所有 .xlsx 文件 files glob.glob(D:/data/*.xlsx) print(files) # 递归搜索所有子目录下的 csv 文件 all_csv glob.glob(D:/data/**/*.csv, recursiveTrue) print(all_csv) # 按文件修改时间排序这个是 glob 的进阶用法先取路径再转 mtime import os sorted_files sorted(all_csv, keyos.path.getmtime, reverseTrue) print(sorted_files[0]) # 最近修改的那个这段代码适合的场景你要跑一批CSV报表又不想手动每次改文件名直接按模式匹配全部扔进循环。我实际在批量处理几十个分站点数据文件时这招每天省我大概十五分钟日积月累还是很可观的。2.3 文件读取的固定三段式with open 编码声明 迭代处理不少教程会这样教f open(data.txt, r) data f.read() f.close()这种写法的问题在于一旦中间代码报错f.close()就不会执行文件句柄被占用。现代Python从根本上摒弃了这种做法统一用with上下文管理器with open(data.txt, r, encodingutf-8) as f: lines f.readlines() # 离开 with 块文件自动关闭 # 如果文件很大不要 readlines()用逐行迭代更省内存 with open(large_log.txt, r, encodingutf-8) as f: for line in f: process_line(line)一个容易被忽略的关键点是encodingutf-8这行一定不能省。我最早写脚本时图省事不声明编码结果在Windows上经常收到UnicodeDecodeError: gbk codec cant decode byte原因就是Windows中文版默认编码是GBK而文件是UTF-8保存的。所以“带编码声明”这句话建议直接刻进肌肉记忆。2.4 JSON与CSV结构化数据的两大标准写法JSON在Python里几乎等同于字典是最容易理解的数据交换格式import json data { user: zhangsan, scores: [88, 95, 76, 99], meta: {level: Lv5, last_login: 2025-06-14} } # 写文件 with open(user.json, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) # 读文件 with open(user.json, r, encodingutf-8) as f: loaded json.load(f) print(loaded[scores][1]) # 95ensure_asciiFalse经常被漏掉——如果你不写中文会被转成\uXXXX这种ASCII转义序列存进文件后基本不可读。indent2是给文件加上缩进方便人眼查看和对比日常很有用。CSV同样高频但要避开一个经典的坑——CSV文件的分隔符问题import csv # 写入 with open(records.csv, w, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([date, revenue, cost]) writer.writerow([2025-06-01, 15000, 7200]) writer.writerow([2025-06-02, 16500, 7300]) # 读取 with open(records.csv, r, encodingutf-8) as f: reader csv.DictReader(f) for row in reader: print(row[revenue])这里有个特别想提醒你的细节如果单条数据里包含逗号或换行直接用writer.writerow即可不需要手动加引号——csv库会自动处理。但如果你写入时漏了newline参数Windows下会在每行后面多一个空行数据量一大文件体积暴增不说后续解析也容易出问题。还有一个值得提的场景如果你要生成的CSV需要放到Excel里打开保存Excel兼容性最佳的中文编码准则时可以选择encodingutf-8-sig否则Excel打开中文会乱码。这也是实际干活时很可能要面对、但教科书很少讲的一个细节。3. 数据加工四虎将collections / statistics / itertools / functools 的短平快套路很多朋友总以为数据加工必须上numpy和pandas其实标准库里这四个模块已经能覆盖非常多的日常场景。它们写起来更轻、没有笨重的依赖适合处理中小规模数据或者作为pandas的辅助工具。3.1 collectionsCounter 和 defaultdict 让你告别重复造轮子统计词频、统计标签出现次数几乎是文本处理最常见的需求。理解Counter最好的切入角度是“一个知道如何计算的字典”from collections import Counter tags [bug, feature, bug, docs, bug, feature] cnt Counter(tags) print(cnt[bug]) # 3 print(cnt.most_common(2)) # [(bug, 3), (feature, 2)]解释一下Counter底层是一个字典键是元素值是计数。most_common(n)返回出现次数最多的前n项排好序给你无需sort。defaultdict解决的是“给不存在的键一个默认值”的问题。比如你想统计每个品类下的销售额总和from collections import defaultdict sales [(apple, 10), (banana, 5), (apple, 20), (cherry, 8)] grouped defaultdict(float) # 不存在的key默认从 0.0 开始 for name, amount in sales: grouped[name] amount print(dict(grouped)) # {apple: 30.0, banana: 5.0, cherry: 8.0}说白了传统dict在处理这类业务时要先写一句if k not in d: d[k] 0用defaultdict就一步完成而且逻辑一下就看明白。3.2 statistics均值、中位数、方差一行调用如果你的数据量不大不需要pandas直接用statistics模块就够了import statistics data [73, 84, 92, 65, 88, 91, 77] print(statistics.mean(data)) # 均值 81.428... print(statistics.median(data)) # 中位数 84.0 try: print(statistics.mode([1, 2, 2, 3])) # 2.0 except statistics.StatisticsError: print(数据中没有唯一众数) # 样本方差和标准差注意默认是样本 s^2不是总体方差 print(statistics.stdev(data))这里有个细节statistics.stdev()默认是样本标准差分母n-1如果你做的是总体分析、数据本身包含了全部个体应该用statistics.pstdev()。这个取舍很重要别看只差几个字母不同业务的判断结论可能因此完全不同。3.3 itertools排列组合与循环切片逻辑干干净净这个模块高级一点但学到就是赚到。什么时候会用到它比如你要给一批关键词生成组合或者做遍历时的分组from itertools import chain, groupby, permutations # 拼接多个可迭代对象为一个大列表 all_items list(chain([1, 2], [a, b], (True, False))) print(all_items) # [1, 2, a, b, True, False] # 求两个字符的所有两位排列可用于密码学联想、验证码候选、交叉测试 for pair in permutations(abc, 2): print(.join(pair), end, ) # ab, ac, ba, bc, ca, cb # groupby 分组注意必须先排序才能正确group data sorted([(A, 1), (B, 2), (A, 3), (B, 4)], keylambda x: x[0]) for key, group in groupby(data, keylambda x: x[0]): print(key, list(group))3.4 functoolslru_cache 是天然的函数级“记忆”这个功能不是黑魔法但从效果上说是“零成本加缓存”的保底招。假设你写了一个非常耗时的计算函数结果在循环里被反复调用同样的入参import functools, time functools.lru_cache(maxsize128) def slow_heavy(key: str) - int: # 模拟耗时计算 time.sleep(1) return len(key) * 10 t0 time.perf_counter() print(slow_heavy(abcdef)) # 第一次运行等1秒 print(slow_heavy(abcdef)) # 第二次直接命中缓存几乎不耗时 print(耗时, time.perf_counter() - t0, 秒)实际在使用时我的建议是当你的递归算斐波那契、动态规划、无副作用查询函数时加一行functools.lru_cache(maxsize...)就行性能提升非常明显。唯一要注意的是被缓存的函数不能依赖外部可变状态比如读文件、请求接口否则拿到的是过期数据这个务必留意。这三个模块之间还有个协同用法defaultdictgroupby做多层分组统计Counteritertools.chain做多文本合并词频。很多时候组合起来用业务代码能省一半。4. 时间与正则datetime、re 的高频匹配模板时间处理和正则匹配这两件事几乎每个数据脚本都会碰到。我的体会是这两块内容不是靠理解就能记住而是靠模板——你只要保存好了固定的“骨架”改几个参数就能覆盖八成需求。4.1 datetime时间戳、字符串、日期对象的三角转换日常接触到的无非三种格式时间戳秒、字符串“2025-06-14 10:30:00”、datetime对象。转换关系就是这三者的互训from datetime import datetime, timedelta # 字符串 - datetime 对象格式串要严格对齐 s 2025-06-14 10:30:00 dt datetime.strptime(s, %Y-%m-%d %H:%M:%S) print(dt.year, dt.month, dt.day) # 2025 6 14 # datetime 对象 - 字符串想输出什么格式就定义什么格式 forward dt.strftime(%Y/%m/%d %H:%M) print(forward) # 2025/06/14 10:30 # datetime 对象 - 时间戳epoch秒 ts dt.timestamp() print(ts) # 时间戳 - 本地时间字符串 print(datetime.fromtimestamp(ts).strftime(%Y-%m-%d)) # 日期加减 tomorrow dt timedelta(days1) last_month dt.replace(monthdt.month - 1) # 注意replace 不校验日期合法性month0会出错 print(tomorrow, last_month)这里有几个易错点值得单说%Y四位年和%y两位年容易混——字符串是“25”但格式写%Y会报错%H是24小时制、%I是12小时制%I通常要搭配%p表示AM/PMreplace(monthdt.month - 1)在1月份会得到month0直接报ValueError: month must be in 1..12。跨年倒推月份要用(dt.replace(day1) - timedelta(days1))这种思路。要按“未来/过去N天”获取日期标准套路是from datetime import date, timedelta today date.today() seven_days_ago today - timedelta(days7) date_str seven_days_ago.strftime(%Y%m%d) # 文件命名利器 print(date_str)4.2 re三组必背模板转换正则这种东西偏不偏科都难记全。但我总结下来日常用得最多、也最值得背下来的无非三件事提取、替换、验证。提取从一段日志里拿到所有邮箱或URLimport re text 联系: a.leeexample.com 或 teamexample.org, 网站 https://demo.com/main?id3 emails re.findall(r[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}, text) urls re.findall(rhttps?://[^\s], text) print(邮箱:, emails) print(URL:, urls)替换清洗文本中的多余空格与指定字符text_raw Hmm... price:12,345 元. Great! cleaned re.sub(r\s, , text_raw).strip() print(repr(cleaned)) # 把连续逗号/句号中间的空格压缩验证判断字符串是否为纯数字、是否为手机号格式pattern_num re.compile(r^\d(\.\d)?$) print(pattern_num.match(12.34) is not None) # True print(pattern_num.match(12a.4) is not None) # False phone re.compile(r^1[3-9]\d{9}$) print(phone.match(13812345678) is not None) # True一个重要经验如果同一个正则要在循环里被多次使用优先re.compile预编译一次性能和使用体验都更好。同时在小规模文本上不用太纠结正则性能真正要注意的是贪婪匹配造成的异常结果——比如re.sub(r.*, , html)会把能匹配到的所有内容删掉而不是只删一个标签这个坑在爬虫和数据清洗里尤其常见。如果你只要按需截断写成.*?用非贪婪模式就对了。4.3. requests网络请求的可靠骨架基本上掌握了爬虫和Web API调用就离不开requests。它不是标准库需要pip install requests但属于安装后“可以一直信到老”的库。一个最小可用的GET模板import requests resp requests.get( https://api.example.com/items, params{page: 1, size: 50}, # params 自动 URL 编码不要手拼url headers{User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)}, timeout10 ) resp.raise_for_status() # 状态码不是2xx直接抛异常防止静默出错 data resp.json() # 接口返回JSON时直接解析成dict print(type(data), data)POST发送JSON数据resp requests.post( https://api.example.com/login, json{username: user, password: pass}, # 自动设置 Content-Type: application/json headers{Authorization: Bearer your_token_here}, timeout10 ) print(resp.status_code, resp.text[:200])这三处容易踩坑的地方我帮你提前圈出来timeout必须设置。不设的话网络异常时脚本可能一直卡住不响应白等几分钟。生产环境建议至少设一个10秒左右的超时重要任务再加retry策略。raise_for_status()在“希望它失败时能明确失败”的场景非常有用——比如检测到404或500时及时跳出来不然后续解析resp.json()会直接抛异常且难定位。爬虫场景下别忘设置像样的User-Agent很多网站会把缺UA的请求当成脚本直接丢弃。分页和时间范围请求在数据分析里也特常用。比如每日拉取量化行情或运营报表时这种带日期变量的循环模板几乎是标准的import time for offset in range(0, 3): resp requests.get( https://api.example.com/records, params{offset: offset * 100, limit: 100}, timeout15 ) resp.raise_for_status() batch resp.json()[data] if not batch: break # 逐批保存/处理 print(f已处理 {len(batch)} 条, offset{offset * 100}) time.sleep(0.5) # 注意合理限速避免为服务器造成压力也保护自己不被封5. 把小抄用起来的三个习惯环境隔离、代码模板化、报错读法工具列完了最后分享怎么把这些内容真正变成你自己的。这三件事我觉得是比单纯记住某个库更重要的顶层习惯。5.1 环境隔离从第一行代码就养成习惯pip install装进全局环境的坏处是两个月后你需要另一个项目的依赖版本及时发现已经有冲突了强制覆盖只会让更多脚本崩掉。正确做法是每个项目单独建虚拟环境# 创建虚拟环境 python -m venv myproject_env # 激活Windows / Mac / Linux 略有差异 myproject_env\Scripts\activate # Windows source myproject_env/bin/activate # Mac / Linux # 一键导出和恢复当前环境依赖 pip freeze requirements.txt pip install -r requirements.txt在VSCode里使用虚拟环境还有个操作要点打开项目文件夹后按CtrlShiftP输入“Python: Select Interpreter”选择你刚创建的环境路径。如果之前从没配过这一步能解决很多“为什么我的代码在这个环境里能跑、换台机器就报ModuleNotFoundError”的困惑。5.2 代码模板化让常用代码成为肌肉记忆把上面这些代码段分门别类保存为.py文件命名清晰每次用时只改核心参数。比如我会在本地维护一个snippets/目录file_io_basics.py文件遍历、读写、CSV/JSON模板datetime_tools.py时间戳、字符串、日期互转regex_common.py邮箱、URL、手机号、日期匹配request_with_retry.py带重试和超时的请求封装。这有一个额外的好处写爬虫或数据分析任务时复制粘贴再改改就行非常省时省精力。这大概是“小抄”存在的真正意义——它不教你深刻原理但它保证你不会在基本用法上浪费时间。5.3 读错报比任何教学视频都有效的成长路径我比较喜欢跟愿意深究的人说遇到报错不要急着搜全文先拷出最后一行的异常类型和描述比如TypeError: unsupported operand type(s) for : int and str。然后想三件事是什么操作触发了它发生在哪个文件哪一行这个变量当前是什么类型很多时候答案自己就出来了。如果再配上Python的关键热词检索——abs函数、列表推导式、lambda、装饰器——基本能把90%的日常问题解决。真正要避免的是复制百度的代码但不理解它为什么能跑那样你只是把问题从一个地方搬到了另一个地方。最后一个实操建议给自己做一个“常用50函数”自测清单96天下来我特别想给你留一个价值密度最高的作业不要去看网上的“50个Python函数大全”而是自己整理一份“我这半年实际用过的函数清单”每个函数只写一句作用和一个记忆提示。比如setdefault(key, default)—— 字典不存在key时设置默认值再取值enumerate(list, start1)—— 遍历时同时拿到下标zip(a, b)—— 把两个列表按位置拼成对.get(key, default)—— 安全取值避免KeyErrorstr.isdigit()—— 判断纯数字但不能判断小数sorted(iterable, keylambda x: ..., reverseTrue)—— 按规则排序。写完之后你会发现你真正高频用到的函数可能就三五十个而它们被你亲手写下来之后就成了独属于你自己的、比任何速查手册都重要的“Python小抄”。等到第99天再回看这张清单你会清楚地看到这段路里你收获的东西远不是语法本身——而是怎么把工具用得顺手、怎么解决问题、以及怎么让自己在越来越复杂的任务里保持从容。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门