Python能做什么?5个适合零基础练手的小项目

小林子
小林子
发布时间:2026-11-01| 9人浏览过
原创

针对零基础学习者的实用指南,通过文件批量整理、命令行记账簿、实时天气查询、图片批量处理和简易网页提取器5个具体小项目,系统解析Python在实际场景中的应用与代码实现。

Python 最核心的实用价值,在于能用简短直观的代码串联本地操作系统、网络数据和文件格式,自动处理重复繁琐的日常事务。很多初学者在背完基础语法后陷入停滞,原因往往不是记忆力不足,而是缺少一个将输入、逻辑与输出串联起来的实际任务。本文不讲抽象概念,直接通过 5 个轻量但功能完整的实用小项目,展示 Python 能够解决的具体问题,以及从零编写这些脚本时的核心思路与避坑关键点。

Python能做什么?5个适合零基础练手的小项目
图1:零基础学习者从语法向实际项目迁移的能力进阶路线

项目一:按扩展名自动归类下载文件夹

日常电脑使用中,下载目录经常堆积各种格式的文件。这个小脚本扫描目标文件夹中的所有直接子文件,根据文件后缀名自动创建对应分类文件夹(如“图片”、“文档”、“压缩包”),并将文件移动进去。

核心实现代码

import os
import shutil
from pathlib import Path

# 定义后缀与目标分类目录的映射关系
CATEGORY_MAP = {
    "图片": [".jpg", ".jpeg", ".png", ".gif", ".webp"],
    "文档": [".pdf", ".docx", ".xlsx", ".pptx", ".txt", ".md"],
    "压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"],
    "安装包": [".dmg", ".pkg", ".exe", ".msi"]
}

def organize_folder(target_dir):
    folder_path = Path(target_dir)
    if not folder_path.exists() or not folder_path.is_dir():
        print(f"指定目录不存在或不是有效文件夹: {target_dir}")
        return

    # 遍历当前目录下的所有文件(不递归深层子目录)
    for item in folder_path.iterdir():
        if item.is_file():
            suffix = item.suffix.lower()
            target_category = "其他文件"

            for category, extensions in CATEGORY_MAP.items():
                if suffix in extensions:
                    target_category = category
                    break

            category_dir = folder_path / target_category
            category_dir.mkdir(exist_ok=True)

            target_file_path = category_dir / item.name
            # 防止重名覆盖
            if target_file_path.exists():
                print(f"跳过已存在文件: {item.name}")
                continue

            shutil.move(str(item), str(target_file_path))
            print(f"已移动: {item.name} -> {target_category}/")

if __name__ == "__main__":
    # 请根据实际环境传入需要整理的目录路径
    organize_folder("./test_download_folder")

重点与注意事项

  • 推荐使用 pathlib.Path:相比传统的 os.path 拼接字符串,Path 对象的面向对象写法(如 folder / item)跨平台兼容性更好,路径斜杠处理更稳健。
  • 必须校验目标文件是否存在:在调用 shutil.move() 之前,一定要判断目标路径是否已存在同名文件,避免静默覆盖造成数据丢失。
  • 测试时先使用临时测试文件夹:初次运行时先建立一个包含几张测试图片的文件夹进行验证,确认行为符合预期后再对真实桌面或下载目录执行。

项目二:终端轻量记账与流水统计工具

这个脚本通过命令行交互录入每日开支,记录包括消费日期、类别、金额和备注,并持久化保存为标准 CSV 文件。退出前能够自动计算当次运行的分类汇总金额,适合练习数据收集与列表操作。

核心实现代码

import csv
from datetime import datetime

FILE_NAME = "expenses.csv"

def init_storage():
    """确保存储文件存在且包含表头"""
    try:
        with open(FILE_NAME, "x", newline="", encoding="utf-8") as f:
            writer = csv.writer(f)
            writer.writerow(["日期", "分类", "金额", "备注"])
    except FileExistsError:
        pass

def add_record(category, amount, remark=""):
    """追加单条收支记录"""
    today_str = datetime.now().strftime("%Y-%m-%d")
    with open(FILE_NAME, "a", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow([today_str, category, f"{amount:.2f}", remark])
    print(f"已记录: {today_str} | {category} | ¥{amount:.2f}")

def show_summary():
    """读取所有记录并按分类计算总额"""
    totals = {}
    with open(FILE_NAME, "r", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            cat = row["分类"]
            amt = float(row["金额"])
            totals[cat] = totals.get(cat, 0.0) + amt

    print("\n--- 历史支出统计汇总 ---")
    if not totals:
        print("暂无记录")
        return
    for cat, total in totals.items():
        print(f"【{cat}】: ¥{total:.2f}")
    print("------------------------\n")

def main():
    init_storage()
    while True:
        print("1. 录入开支  2. 查看汇总  3. 退出")
        choice = input("请选择操作 (1/2/3): ").strip()
        if choice == "1":
            cat = input("请输入分类 (例如 餐饮/交通/学习): ").strip()
            try:
                amt = float(input("请输入金额 (元): ").strip())
                if amt <= 0:
                    print("金额必须大于0,请重新输入。")
                    continue
            except ValueError:
                print("金额必须是有效数字,请重新输入。")
                continue
            remark = input("请输入备注 (可选): ").strip()
            add_record(cat, amt, remark)
        elif choice == "2":
            show_summary()
        elif choice == "3":
            print("已退出记账程序。")
            break
        else:
            print("无效输入,请输入 1、2 或 3。")

if __name__ == "__main__":
    main()
Python能做什么?5个适合零基础练手的小项目
图2:数据录入型脚本的执行阶段与异常阻断机制

项目三:调用开放接口查询实时天气

该项目展示 Python 如何连通外部互联网。无需安装任何第三方库,完全基于标准库 urllib.request 和 json,向公开免费的气象接口发起 HTTP 请求,将返回的 JSON 数据解析为人类易读的文本展示在终端上。

核心实现代码

import json
import urllib.request
import urllib.error

# 使用公开可免Key测试的天气接口示范(以 Open-Meteo 为例,传入北京经纬度)
API_URL = "https://api.open-meteo.com/v1/forecast?latitude=39.9042&longitude=116.4074&current_weather=true"

def fetch_beijing_weather():
    print("正在请求当前天气数据...")
    request = urllib.request.Request(
        API_URL,
        headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
    )
    
    try:
        with urllib.request.urlopen(request, timeout=10) as response:
            if response.status != 200:
                print(f"接口响应异常,状态码: {response.status}")
                return
            raw_data = response.read().decode("utf-8")
            data = json.loads(raw_data)
            
            # 解析关键气象字段
            current = data.get("current_weather", {})
            temp = current.get("temperature")
            windspeed = current.get("windspeed")
            time_str = current.get("time")

            print("\n====== 北京实时气象播报 ======")
            print(f"数据采集时间: {time_str}")
            print(f"当前实时气温: {temp} ℃")
            print(f"当前实时风速: {windspeed} km/h")
            print("==============================\n")

    except urllib.error.URLError as e:
        print(f"网络连接失败,请检查网络设置或代理: {e.reason}")
    except json.JSONDecodeError:
        print("接口返回的数据不是有效的 JSON 格式")

if __name__ == "__main__":
    fetch_beijing_weather()
初学者核心收获

这个项目帮助理解了两个日常极其普遍的计算机概念:HTTP 状态码与响应体、JSON 字符串与 Python 字典的映射关系。掌握了 json.loads() 之后,几乎所有互联网开放 API(汇率、股票、新闻)的调用逻辑都完全相同。

项目四:批量图片压缩与格式转换工具

工作中经常遇到“把一批 PNG 图片全部转成 JPG 并缩小分辨率”的需求。该项目引入最主流的图像处理第三方库 Pillow,使用两行核心代码即可完成单个图片的缩放与转码,结合循环就能批量处理成百上千张照片。

准备环境与安装

pip install Pillow

核心实现代码

from pathlib import Path
from PIL import Image

def batch_process_images(source_folder, output_folder, max_width=1200, quality=80):
    src_path = Path(source_folder)
    out_path = Path(output_folder)
    out_path.mkdir(exist_ok=True)

    if not src_path.exists():
        print(f"源目录不存在: {source_folder}")
        return

    # 支持常见的图片格式
    valid_extensions = {".png", ".jpg", ".jpeg", ".bmp", ".webp"}
    count = 0

    for file in src_path.iterdir():
        if file.suffix.lower() in valid_extensions:
            try:
                with Image.open(file) as img:
                    # 统一转为 RGB 模式,防止带有透明通道的 PNG 转换为 JPG 时报错
                    if img.mode in ("RGBA", "P"):
                        img = img.convert("RGB")

                    # 按比例等比缩放
                    width, height = img.size
                    if width > max_width:
                        new_height = int((max_width / width) * height)
                        img = img.resize((max_width, new_height), Image.Resampling.LANCZOS)

                    target_file = out_path / f"{file.stem}_compressed.jpg"
                    img.save(target_file, "JPEG", optimize=True, quality=quality)
                    count += 1
                    print(f"已处理: {file.name} -> {target_file.name}")
            except Exception as e:
                print(f"处理文件 {file.name} 时出错: {e}")

    print(f"\n处理完成,共优化处理 {count} 张图片。")

if __name__ == "__main__":
    # 执行前替换为本地真实测试路径
    batch_process_images("./raw_photos", "./compressed_photos")

关键技术点解析

  • 模式转换 img.convert("RGB"):PNG 图片常带有 Alpha 透明通道(RGBA 模式),直接另存为 JPEG 格式会引发 OSError: cannot write mode RGBA as JPEG。先转为 RGB 是批量转换脚本必须具备的防护代码。
  • 重采样滤波算法:使用 Image.Resampling.LANCZOS 可以在大幅度缩小图片时保留边缘清晰度,避免模糊或锯齿。

项目五:指定网页热点条目提取器

网络爬虫是 Python 最为人熟知的应用之一。零基础无需直接接触复杂的爬虫框架,利用内置的 html.parser 或轻量的正则表达式,即可从网页原始 HTML 中精准提取目标文字与超链接。

核心实现代码

import urllib.request
import re

TARGET_URL = "https://news.ycombinator.com/"

def fetch_hacker_news_titles():
    req = urllib.request.Request(
        TARGET_URL,
        headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}
    )

    try:
        with urllib.request.urlopen(req, timeout=10) as resp:
            html = resp.read().decode("utf-8")

        # 使用正则快速匹配标题链接与文字
        # 匹配 class="titleline" 下方的 <a href="...">标题</a>
        pattern = re.compile(r'<span class="titleline"><a href="([^"]+)"[^>]*>([^<]+)</a>')
        matches = pattern.findall(html)

        print(f"成功提取到 {len(matches)} 条热点新闻条目:\n")
        for idx, (link, title) in enumerate(matches[:10], 1):
            print(f"{idx}. {title}")
            print(f"   链接: {link}")

    except Exception as e:
        print(f"爬取失败: {e}")

if __name__ == "__main__":
    fetch_hacker_news_titles()
爬虫边界与合规提醒

写爬虫必须设置合理的请求头(User-Agent),并在循环多页请求时添加 time.sleep(1) 延时,尊重网站服务负载。对于动态渲染(JavaScript 异步加载)的复杂页面,后续可按需了解 Selenium 或 Playwright 工具。

Python能做什么?5个适合零基础练手的小项目
图3:5个小项目的技术栈与输出价值横向对照表

零基础写项目时的两套实用工作法

1. 从下往上读 Traceback 报错栈

新手遇到报错往往因为满屏英文而感到焦虑。实际上,Python 的 Traceback 信息是倒序显示的。排查时应当先看最后一行(例如 FileNotFoundError: [Errno 2] No such file or directory),它直接给出了致命原因;接着往上看紧挨着的报错代码行号,定位具体在哪一行变量或方法调用出现了失误。绝大部分初学者问题都是拼写错误、路径拼错或类型不符。

2. 把大需求拆分为“输入-变换-输出”三个独立小函数

不要尝试一气呵成写完整段脚本。以图片压缩为例,正确的编写节奏是:

  1. 第一步验证输入:写一个只打印文件夹中所有图片文件名的 5 行小脚本,确保能找到文件。
  2. 第二步验证单体处理:只针对单张图片调用 img.save(),检查压缩后的画质与大小。
  3. 第三步组合循环:将单张处理逻辑包装成函数,嵌套到第一步的文件遍历循环中。
Python能做什么?5个适合零基础练手的小项目
图4:从验证小想法到形成高可靠工具的四个迭代阶段

总结与练习建议

学习编程不是比拼记住了多少关键字,而是训练将日常现实需求转化为具体逻辑步骤的能力。以上 5 个项目涵盖了本地磁盘管理、结构化数据读写、网络数据交互、多媒体处理和网页清洗五个最具代表性的方向。建议从其中一个与自己日常电脑使用关系最密切的项目切入,照着示例跑通后,尝试做一点定制改动(例如给文件整理器增加按月份归档,或给天气脚本增加空气质量输出),在不断解决微小问题的过程中,建立对 Python 实际应用能力的扎实感知。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。