Python实战常用案例实操?

wen python案例 5

Python实战常用案例实操:从零构建高效自动化脚本

目录导读

  1. 为什么你需要掌握Python实战案例?
  2. 文件批量处理与重命名
    • 1 痛点场景
    • 2 代码实现
    • 3 提问:如何让脚本支持不同文件类型?
  3. Excel数据清洗与自动汇总
    • 1 数据清洗逻辑
    • 2 整合pandas与openpyxl
    • 3 提问:遇到内存不足怎么办?
  4. 爬虫抓取动态网页数据
    • 1 使用selenium处理JavaScript渲染
    • 2 反爬破解技巧
    • 3 提问:如何确保爬虫不触犯法律?
  5. 定时任务与邮件自动化
    • 1 用schedule库设置循环任务
    • 2 联动SMTP发送报告
    • 3 提问:如何防止邮件被误判为垃圾邮件?
  6. 内存优化与性能调试
    • 1 使用generator替代list
    • 2 多线程/多进程选择
    • 3 提问:如何分析脚本瓶颈?
  7. 综合实战:搭建小型数据监控面板
  8. 问答精华汇总

为什么你需要掌握Python实战案例?

很多Python学习者都会陷入“语法全会,实战全废”的尴尬,当面对真实项目时,琐碎的异常处理、文件路径兼容、第三方库版本冲突等问题会瞬间击垮信心。实战案例不是代码堆砌,而是将理论转化为生产力的桥梁。

根据2025年Stack Overflow调研,超过68%的开发者认为“能够独立完成一个可运行的工具”比“背熟所有函数”更重要,本文通过5个高频场景案例,带你绕过常见坑点,并附上我会在刚搜索到的真实反馈中修正的常见错误


案例一:文件批量处理与重命名

1 痛点场景

你手头有1000个以”IMG_20231001_001.jpg”命名的照片,需要按”日期-序号”格式重命名为”20231001-001.jpg”,并过滤掉小于50KB的缩略图。

2 代码实现

import os
import glob
def batch_rename_pics(folder_path, min_size=50*1024):
    files = glob.glob(os.path.join(folder_path, '*.jpg'))
    for i, file_path in enumerate(files, start=1):
        if os.path.getsize(file_path) < min_size:
            os.remove(file_path)  # 删除小图
            continue
        # 提取原日期部分(示例模式)
        dir_name = os.path.dirname(file_path)
        new_name = f"{'20231001'}-{i:03d}.jpg"
        os.rename(file_path, os.path.join(dir_name, new_name))
        # 新增:进度反馈
        if i % 100 == 0:
            print(f"已处理 {i} 个文件")
# 使用
batch_rename_pics('./photos')

3 提问:如何让脚本支持不同文件类型?

回答:glob.glob(‘*.jpg’)改为动态接收扩展名列表,例如extensions = ['.jpg','.png','.gif'],循环逐个类型处理,同时建议使用pathlib库替代os.path以获得更好的跨平台兼容性。


案例二:Excel数据清洗与自动汇总

1 数据清洗逻辑

常见污染数据包括:空行、重复记录、异常字符(如金额列中混入”N/A”)、日期格式不一致。永远不要直接在原文件上修改,应生成备份副本。

2 整合pandas与openpyxl

import pandas as pd
from openpyxl import load_workbook
def clean_and_summary(input_file, output_file):
    df = pd.read_excel(input_file)
    # 步骤1:删除全空行
    df.dropna(how='all', inplace=True)
    # 步骤2:金额列转数值并填充无效值
    df['金额'] = pd.to_numeric(df['金额'], errors='coerce').fillna(0)
    # 步骤3:按日期升序去重
    df.drop_duplicates(subset=['订单号'], keep='first', inplace=True)
    # 汇总:按城市计算总金额
    summary = df.groupby('城市')['金额'].sum().reset_index()
    # 写入新excel(保留原格式)
    with pd.ExcelWriter(output_file) as writer:
        df.to_excel(writer, sheet_name='清洗后', index=False)
        summary.to_excel(writer, sheet_name='汇总', index=False)

3 提问:遇到内存不足怎么办?

回答: 使用chunksize参数分块读取数据,或者利用pandasdtype指定列类型为category减少内存占用,如果数据超1GB,建议改用dask库进行分布式处理。


案例三:爬虫抓取动态网页数据

1 使用selenium处理JavaScript渲染

大部分电商或社交网站的数据通过API或异步JS加载,需使用selenium配合webdriver-manager

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 无头模式
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
driver.get('目标网址')
# 等待动态内容加载
driver.implicitly_wait(10)
items = driver.find_elements(By.CLASS_NAME, 'item-name')

2 反爬破解技巧

  • 添加随机User-Agent和请求延迟(time.sleep(random.uniform(1, 3))
  • 使用fake_useragent库伪造浏览器指纹
  • 识别CAPTCHA时接入2Captcha API(但不推荐用于违法用途

3 提问:如何确保爬虫不触犯法律?

回答: 仅抓取公开数据,遵守robots.txt协议,控制抓取频率(至少间隔1秒/次),不抓取需登录的个人隐私数据,建议所有商业爬虫咨询律师并获取网站书面许可。


案例四:定时任务与邮件自动化

1 用schedule库设置循环任务

避免使用time.sleep()阻塞主进程,schedule库更优雅:

import schedule
import time
def job():
    print("数据报告已生成")
    send_email()
schedule.every().day.at("09:00").do(job)  # 每天9点执行
while True:
    schedule.run_pending()
    time.sleep(60)  # 每1分钟检查一次

2 联动SMTP发送报告

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email():
    msg = MIMEMultipart()
    msg['Subject'] = '日数据报告'
    msg['From'] = 'sender@example.com'
    msg['To'] = 'receiver@example.com'
    body = MIMEText('请查看附件', 'plain', 'utf-8')
    msg.attach(body)
    # 添加附件
    with open('report.xlsx', 'rb') as f:
        att = MIMEText(f.read(), 'base64', 'utf-8')
        att["Content-Disposition"] = 'attachment; filename="report.xlsx"'
        msg.attach(att)
    with smtplib.SMTP('smtp.qq.com', 587) as server:
        server.starttls()
        server.login('sender@example.com', '授权码')  # 非密码
        server.send_message(msg)

3 提问:如何防止邮件被误判为垃圾邮件?

回答: 配置SPF/DKIM/DMARC记录,发送频率不超过每小时10封,使用专业邮箱服务商(如SendGrid),避免过多图片或敏感词(如“免费”“立即行动”)。


案例五:内存优化与性能调试

1 使用generator替代list

处理1亿行日志时,生成器可以显著降低内存:

# 低效:把所有行加载到列表
with open('huge.log') as f:
    lines = f.readlines()  # 内存爆炸!
# 高效:逐行生成器
def read_large(file_path):
    with open(file_path) as f:
        for line in f:
            yield line.strip()
for line in read_large('huge.log'):
    process(line)

2 多线程/多进程选择

  • IO密集型(如网络请求、文件读写):concurrent.futures.ThreadPoolExecutor(GIL不影响IO)
  • CPU密集型(如计算、图像处理):multiprocessing.PoolProcessPoolExecutor

3 提问:如何分析脚本瓶颈?

回答: 使用内置cProfile模块输出统计报告:python -m cProfile script.py,或安装py-spy实时查看火焰图,对于简单的耗时检测,临时的time.time()差分即可。


综合实战:搭建小型数据监控面板

结合以上案例,你可以实现一个脚本:每天定时爬取某API的股票数据 → 清洗Excel → 计算关键指标 → 将结果写入数据库或生成HTML → 通过邮件发送给团队,代码架构建议如下:

project/
├── config.py          # 存放数据库连接、邮件参数
├── scraper.py         # 继承案例三的爬虫逻辑
├── cleaner.py         # 复用案例二的数据清洗
├── reporter.py        # 生成报告及邮件
└── main.py            # 调用schedule定时运行

关键点:每个模块设计为独立函数,便于单测和复用。


问答精华汇总

Q1:我的Python版本是3.8,这些代码需要修改吗? 大部分代码兼容3.8+,但注意match-case(3.10起). 建议升级到3.11以上获得性能提升。

Q2:pandas读取大文件时如何指定列类型减少内存? 使用pd.read_csv(‘data.csv’, dtype={‘city’: ‘category’, ‘amount’: ‘float32’}),字符串列用category可减少50%以上内存。

Q3:selenium启动很慢,有没有替代方案? 对于一些简单的动态数据,可以尝试requests + parsel解析API响应(按F12检查Network标签页),如果必须用浏览器,推荐playwright库(速度更快)。

Q4:脚本在Windows正常,但Linux上报路径错误如何解决? 永远使用pathlib.Path代替硬编码反斜杠,例如Path(‘./photos’).resolve(),Linux系统注意区分大小写。


通过以上5个案例,你不仅学会了如何写出可运行的脚本,更懂得了如何考虑异常、资源消耗、以及让代码符合商业环境的要求,建议你打开IDE,立刻修改其中一个案例进行二次开发,然后将其放到真实场景中运行——这比看100篇教程更有用。Python实战的精髓不在于“我会”,而在于“我run过”。

标签: Python实战

抱歉,评论功能暂时关闭!