学 Python 最大的“爽点”就在这章:把重复、枯燥、易错的人工活,交给几十行脚本。我们讲批量文件处理、正则表达式、网络请求、Excel/PDF 与邮件自动化,最后用一个“文件整理工具”把知识落地。
import os, shutil
src = "inbox" # 待整理目录
for name in os.listdir(src):
path = os.path.join(src, name)
if os.path.isfile(path):
ext = name.split(".")[-1].lower() # 取扩展名
target = os.path.join(src, ext) # 按类型建文件夹
os.makedirs(target, exist_ok=True)
shutil.move(path, os.path.join(target, name))
print("已移动", name, "→", ext + "/")
下面两个小例子把“遍历—判断—移动”落地:先给一批文件批量加序号前缀(生活场景),再统计目录里各类型文件的数量(贴近整理工具)。
import os, tempfile, shutil
d = tempfile.mkdtemp()
for n in ["a.txt", "b.txt", "c.txt"]:
open(os.path.join(d, n), "w").close()
i = 1
for name in sorted(os.listdir(d)):
if name.endswith(".txt"):
new = f"笔记_{i}.txt"
os.rename(os.path.join(d, name), os.path.join(d, new))
i += 1
print(sorted(os.listdir(d)))
shutil.rmtree(d)
import os, tempfile, shutil
from collections import Counter
d = tempfile.mkdtemp()
for n in ["报告.txt", "图片.png", "数据.csv", "照片.jpg", "笔记.txt"]:
open(os.path.join(d, n), "w").close()
exts = Counter(n.split(".")[-1].lower() for n in os.listdir(d))
print("按类型统计:", dict(exts))
shutil.rmtree(d)
import re
text = "联系:alice@mail.com,bob@test.org,电话 138-0000-1234"
# 提取所有邮箱
emails = re.findall(r"[\w.-]+@[\w.-]+", text)
print(emails)
# 提取手机号(1 开头,11 位)
phone = re.search(r"1\d{2}-\d{4}-\d{4}", text)
print(phone.group() if phone else "无")
下面两个小例子:先从一段订单文字里抠出所有日期(生活场景),再批量统计日志里的报错时间(贴近监控项目)。
import re
text = "订单时间:2026-09-15 和 2026-10-01,发货 2026/11/20"
dates = re.findall(r"\d{4}[-/]\d{2}[-/]\d{2}", text)
print("找到日期:", dates)
import re
log = "ERROR 10:22:01 磁盘满 | INFO 10:25:03 已恢复 | ERROR 10:30:11 网络断开"
errors = re.findall(r"ERROR (\d{2}:\d{2}:\d{2})", log)
print("ERROR 次数:", len(errors))
print("发生时间:", errors)
import requests
r = requests.get("https://example.com", timeout=5)
print("状态码:", r.status_code)
print("网页长度:", len(r.text)) # r.text 是网页 HTML 文本
# 取 JSON 接口更简单
# data = requests.get("https://api.xxx.com/weather").json()
下面两个小例子都用标准库 urllib(无需安装第三方库):先学会正确地“拼出请求地址”,再演示“取回网页文本并解析标题”。
from urllib.parse import urlencode, quote
base = "https://api.example.com/search"
params = {"q": "Python 自动化", "page": 1}
url = base + "?" + urlencode(params)
print("请求地址:", url)
print("编码后关键词:", quote("Python 自动化"))
import urllib.request, urllib.parse, re
html = "<html><head><title>码上问学</title></head><body>欢迎学习</body></html>"
url = "data:text/html," + urllib.parse.quote(html)
with urllib.request.urlopen(url) as resp:
page = resp.read().decode("utf-8")
title = re.search(r"<title>(.*?)</title>", page)
print("网页标题:", title.group(1) if title else "无")
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.append(["姓名", "分数"])
ws.append(["张三", 90])
ws.append(["李四", 85])
wb.save("成绩表.xlsx") # 一键生成 Excel
下面用标准库实现两个小例子(无需安装):先用 csv 读成绩表算平均分(生活场景),再用 smtplib/email 构造一封通知邮件(贴近项目)。最后补充一个 PDF 抽取示例(需先安装第三方库)。
import csv, io
data = "姓名,分数\n张三,90\n李四,85\n王五,95\n"
rows = list(csv.DictReader(io.StringIO(data)))
total = sum(int(r["分数"]) for r in rows)
print("人数:", len(rows))
print("平均分:", total / len(rows))
from email.message import EmailMessage
msg = EmailMessage()
msg["From"] = "bot@school.com"
msg["To"] = "teacher@school.com"
msg["Subject"] = "每日成绩报告"
msg.set_content("今日已完成 3 份成绩汇总,平均分 90。")
print("收件人:", msg["To"])
print("主题:", msg["Subject"])
print("正文:", msg.get_content().strip())
# 需先安装:pip install pdfplumber
import pdfplumber
with pdfplumber.open("报告.pdf") as pdf:
text = pdf.pages[0].extract_text()
print(text)
把“按类型归类”升级成“按日期归类”:扫描目录,把每个文件按“年-月”放进对应文件夹,并用正则从文件名里提取日期(没有则用文件修改时间)。
import os, shutil, re, datetime
def organize(folder):
for name in os.listdir(folder):
path = os.path.join(folder, name)
if not os.path.isfile(path):
continue
m = re.search(r"(\d{4})-(\d{2})", name) # 先从文件名找 年-月
if m:
ym = f"{m.group(1)}-{m.group(2)}"
else:
t = os.path.getmtime(path) # 否则用修改时间
ym = datetime.datetime.fromtimestamp(t).strftime("%Y-%m")
dest = os.path.join(folder, ym)
os.makedirs(dest, exist_ok=True)
shutil.move(path, os.path.join(dest, name))
print(name, "→", ym)
organize("downloads")
1用 pathlib 遍历一个目录,找出所有大于 0 字节的 .py 文件,打印它们的文件名和字节大小(从小到大排序)。
提示:用 Path.glob("*.py") 匹配文件,用 p.stat().st_size 取大小,再判断 > 0;最后 sorted() 保证顺序固定。
from pathlib import Path
import tempfile, shutil
d = Path(tempfile.mkdtemp())
for n, size in [("a.py", 10), ("b.py", 20), ("c.txt", 5)]:
(d / n).write_bytes(b"x" * size)
for p in sorted(d.glob("*.py")):
if p.stat().st_size > 0:
print(p.name, p.stat().st_size, "字节")
shutil.rmtree(d)