Python能做什么?5个适合零基础练手的小项目
针对零基础学习者的实用指南,通过文件批量整理、命令行记账簿、实时天气查询、图片批量处理和简易网页提取器5个具体小项目,系统解析Python在实际场景中的应用与代码实现。
Python 最核心的实用价值,在于能用简短直观的代码串联本地操作系统、网络数据和文件格式,自动处理重复繁琐的日常事务。很多初学者在背完基础语法后陷入停滞,原因往往不是记忆力不足,而是缺少一个将输入、逻辑与输出串联起来的实际任务。本文不讲抽象概念,直接通过 5 个轻量但功能完整的实用小项目,展示 Python 能够解决的具体问题,以及从零编写这些脚本时的核心思路与避坑关键点。
项目一:按扩展名自动归类下载文件夹
日常电脑使用中,下载目录经常堆积各种格式的文件。这个小脚本扫描目标文件夹中的所有直接子文件,根据文件后缀名自动创建对应分类文件夹(如“图片”、“文档”、“压缩包”),并将文件移动进去。
核心实现代码
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 如何连通外部互联网。无需安装任何第三方库,完全基于标准库 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¤t_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 工具。
零基础写项目时的两套实用工作法
1. 从下往上读 Traceback 报错栈
新手遇到报错往往因为满屏英文而感到焦虑。实际上,Python 的 Traceback 信息是倒序显示的。排查时应当先看最后一行(例如 FileNotFoundError: [Errno 2] No such file or directory),它直接给出了致命原因;接着往上看紧挨着的报错代码行号,定位具体在哪一行变量或方法调用出现了失误。绝大部分初学者问题都是拼写错误、路径拼错或类型不符。
2. 把大需求拆分为“输入-变换-输出”三个独立小函数
不要尝试一气呵成写完整段脚本。以图片压缩为例,正确的编写节奏是:
- 第一步验证输入:写一个只打印文件夹中所有图片文件名的 5 行小脚本,确保能找到文件。
- 第二步验证单体处理:只针对单张图片调用
img.save(),检查压缩后的画质与大小。 - 第三步组合循环:将单张处理逻辑包装成函数,嵌套到第一步的文件遍历循环中。
总结与练习建议
学习编程不是比拼记住了多少关键字,而是训练将日常现实需求转化为具体逻辑步骤的能力。以上 5 个项目涵盖了本地磁盘管理、结构化数据读写、网络数据交互、多媒体处理和网页清洗五个最具代表性的方向。建议从其中一个与自己日常电脑使用关系最密切的项目切入,照着示例跑通后,尝试做一点定制改动(例如给文件整理器增加按月份归档,或给天气脚本增加空气质量输出),在不断解决微小问题的过程中,建立对 Python 实际应用能力的扎实感知。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













