欢迎光临
我们一直在努力

Python 入门实战:3 个小项目练手(附完整代码)

学完 Python 基础语法后,最关键的是 “用起来”—— 通过实战项目巩固知识,才能真正掌握。今天分享 3 个适合入门的实战项目,涵盖交互逻辑、文件操作、数据统计,全部用 Python 内置库实现(无需额外装包),每个项目都有完整代码和详细注释,跟着做就能学会!

项目 1:控制台计算器(巩固函数 + 异常处理)

1. 项目需求

  • 支持 加减乘除 4 种基本运算;
  • 能 连续计算(算完一次后可继续算,不用重启程序);
  • 处理异常情况:输入不是数字、除法除数为 0、输入无效运算符。
  • 2. 实现思路

  • while True 实现连续计算,按 q 退出;
  • 用函数 calculate(num1, num2, op) 封装计算逻辑;
  • try-except 捕获输入错误(非数字、除数为 0);
  • 先获取用户输入的两个数字和运算符,再调用计算函数,最后输出结果。
  • 3. 完整代码

    def calculate(num1, num2, op):

        """

        计算两个数的运算结果

        参数:

            num1: 第一个数字(float

            num2: 第二个数字(float

            op: 运算符(+*/

        返回:

            运算结果(float),若运算符无效返回None

        """

        if op == '+':

            return num1 + num2

        elif op == '-':

            return num1 – num2

        elif op == '*':

            return num1 * num2

        elif op == '/':

            # 处理除法除数为0的情况(这里先判断,也可在调用时用try-except

            if num2 == 0:

                print("❌ 错误:除数不能为0")

                return None

            return num1 / num2

        else:

            print(f"❌ 错误:无效运算符 '{op}',仅支持 +*/")

            return None

    # 主程序:连续计算逻辑

    print("=" * 30)

    print("      Python 控制台计算器")

    print("  支持 +*/ 运算,输入 q 退出")

    print("=" * 30)

    while True:

        # 1. 获取用户输入(支持退出)

        input_str = input("\\n请按格式输入(例:3 + 5):")

        if input_str.strip().lower() == 'q':

            print("👋 程序退出,再见!")

            break  # 退出循环,结束程序

        # 2. 解析输入(按空格分割成 数字1、运算符、数字2

        parts = input_str.strip().split()

        if len(parts) != 3:

            print("❌ 输入格式错误!请按 '数字 运算符 数字' 格式输入(例:3 + 5")

            continue  # 跳过本次循环,重新输入

        num1_str, op, num2_str = parts

        # 3. 转换数字(处理非数字输入)

        try:

            num1 = float(num1_str)  # 支持小数输入

            num2 = float(num2_str)

        except ValueError:

            print("❌ 错误:请输入有效的数字(例:35.2")

            continue

        # 4. 调用计算函数并输出结果

        result = calculate(num1, num2, op)

        if result is not None:  # 只有计算成功时才输出结果

            print(f"✅ 结果:{num1} {op} {num2} = {result}")

    4. 运行步骤

  • 复制代码到 PyCharm 或 IDLE;
  • 运行程序,按提示输入(例:10 – 5);
  • 想退出时输入 q 即可。
  • 5. 拓展建议

  • 新增运算:比如平方(**)、开方(用 math.sqrt());
  • 记忆功能:记录上一次的计算结果,下次可直接用 last 代表上一次结果。
  • 项目 2:批量改文件名(掌握文件操作)

    1. 项目需求

  • 批量给文件夹里的文件 加前缀 / 后缀(例:把 “1.jpg” 改成 “旅行_1.jpg”);
  • 批量 替换文件名中的字符(例:把 “2024_照片.jpg” 改成 “2025_照片.jpg”);
  • 处理异常:目标文件夹不存在、文件夹为空、文件重名。
  • 2. 实现思路

  • os 模块操作文件(os.listdir() 遍历文件、os.rename() 改文件名);
  • 让用户选择 “加前缀 / 后缀” 或 “替换字符” 模式;
  • 验证目标文件夹是否存在,避免路径错误;
  • 遍历文件时跳过文件夹(只改文件,不改子文件夹)。
  • 3. 完整代码

    import os

    def batch_rename_files(folder_path, mode, prefix="", suffix="", old_char="", new_char=""):

        """

        批量修改文件名

        参数:

            folder_path: 目标文件夹路径(例:"C:/Photos" "./my_files"

            mode: 操作模式(1=加前缀/后缀,2=替换字符)

            prefix: 前缀(mode=1时用)

            suffix: 后缀(mode=1时用,加在文件名和扩展名之间)

            old_char: 要替换的旧字符(mode=2时用)

            new_char: 替换后的新字符(mode=2时用)

        """

        # 1. 验证文件夹是否存在

        if not os.path.exists(folder_path):

            print(f"❌ 错误:文件夹 '{folder_path}' 不存在!")

            return

        if not os.path.isdir(folder_path):

            print(f"❌ 错误:'{folder_path}' 不是文件夹!")

            return

        # 2. 遍历文件夹中的所有文件/文件夹

        file_list = os.listdir(folder_path)

        if len(file_list) == 0:

            print(f"ℹ️ 提示:文件夹 '{folder_path}' 为空,无需修改。")

            return

        modified_count = 0  # 记录修改成功的文件数

        for filename in file_list:

            # 跳过子文件夹(只处理文件)

            file_path = os.path.join(folder_path, filename)

            if os.path.isdir(file_path):

                continue  # 是文件夹,跳过

            # 分离文件名和扩展名(例:"1.jpg" → 文件名"1",扩展名".jpg"

            name, ext = os.path.splitext(filename)

            new_name = ""  # 新文件名

            # 3. 根据模式生成新文件名

            if mode == 1:

                # 模式1:加前缀和后缀(例:name=1, prefix=旅行_, suffix=_2024 → 旅行_1_2024.jpg

                new_name = f"{prefix}{name}{suffix}{ext}"

            elif mode == 2:

                # 模式2:替换字符(例:name=2024_照片替换20242025 → 2025_照片.jpg

                if old_char not in name:

                    print(f"ℹ️ 提示:文件 '{filename}' 中没有 '{old_char}',跳过。")

                    continue

                new_name = f"{name.replace(old_char, new_char)}{ext}"

            else:

                print("❌ 错误:无效模式!仅支持 1(加前缀/后缀)或 2(替换字符)。")

                return

            # 4. 生成新旧文件的完整路径(避免路径错误)

            old_full_path = os.path.join(folder_path, filename)

            new_full_path = os.path.join(folder_path, new_name)

            # 5. 避免新文件名已存在(防止覆盖)

            if os.path.exists(new_full_path):

                print(f"❌ 错误:文件 '{new_name}' 已存在,跳过 '{filename}'")

                continue

            # 6. 执行重命名

            try:

                os.rename(old_full_path, new_full_path)

                print(f"✅ 成功:{filename} → {new_name}")

                modified_count += 1

            except Exception as e:

                print(f"❌ 失败:修改 '{filename}' 时出错 → {e}")

        # 7. 输出最终结果

        print(f"\\n✅ 批量修改完成!共处理 {len(file_list)} 个文件,成功修改 {modified_count} 个。")

    # 主程序:用户交互

    if __name__ == "__main__":

        print("=" * 30)

        print("      Python 批量改文件名工具")

        print("=" * 30)

        # 1. 获取目标文件夹路径(建议用相对路径,例:"./my_photos",表示当前文件夹下的my_photos

        folder = input("请输入目标文件夹路径:").strip()

        # 2. 选择操作模式

        print("\\n请选择操作模式:")

        print("1. 给文件名加前缀/后缀(例:1.jpg → 旅行_1_2024.jpg")

        print("2. 替换文件名中的字符(例:2024_照片.jpg → 2025_照片.jpg")

        mode = input("输入模式编号(1/2):").strip()

        # 3. 根据模式获取参数并调用函数

        if mode == "1":

            prefix = input("请输入前缀(例:旅行_,无则按回车):").strip()

            suffix = input("请输入后缀(例:_2024,无则按回车):").strip()

            batch_rename_files(folder, mode=1, prefix=prefix, suffix=suffix)

        elif mode == "2":

            old_char = input("请输入要替换的旧字符(例:2024):").strip()

            new_char = input("请输入替换后的新字符(例:2025):").strip()

            if not old_char:

                print("❌ 错误:要替换的旧字符不能为空!")

            else:

                batch_rename_files(folder, mode=2, old_char=old_char, new_char=new_char)

        else:

            print("❌ 错误:无效模式!请输入 1 2")

    4. 运行步骤

  • 准备一个文件夹(例:./my_photos,放在代码文件同一目录下),里面放几个测试文件(如图片、文档);
  • 运行代码,输入文件夹路径(相对路径直接输 ./my_photos,绝对路径输 C:/Users/XXX/Desktop/my_photos);
  • 选择模式:比如选 1,输入前缀 “旅行_”,后缀 “_2024”,即可批量修改。
  • 5. 拓展建议

  • 按文件类型筛选:只修改 .jpg.txt 文件;
  • 按顺序编号:把 “文件 1.jpg”“文件 2.jpg” 改成 “001.jpg”“002.jpg”(补零对齐)。
  • 项目 3:账单统计工具(处理实际数据)

    1. 项目需求

  • 读取 CSV 格式的账单文件(日常消费记录,含 “日期、分类、金额、备注”);
  • 统计核心数据:总支出、平均每次支出、各分类支出(如餐饮、交通)及占比;
  • 处理异常:账单文件不存在、文件格式错误、金额不是数字。
  • 2. 实现思路

  • csv 模块读取 CSV 文件(Python 内置,无需装包);
  • 用字典 category_total 统计各分类的总金额;
  • 计算总支出、平均支出、分类占比;
  • try-except 处理文件读取和数据转换错误。
  • 3. 完整代码

    第一步:准备账单 CSV 文件

    先在代码同一目录下创建 bill.csv 文件,内容如下(每行是一条消费记录):

    日期,分类,金额,备注

    2024-10-01,餐饮,35.5,早餐

    2024-10-02,交通,8,地铁

    2024-10-03,餐饮,68,晚餐

    2024-10-05,购物,199,衣服

    2024-10-07,交通,2,公交

    2024-10-09,餐饮,45,午餐

    2024-10-10,娱乐,80,电影

    第二步:账单统计代码

    import csv

    def analyze_bill(csv_file_path):

        """

        分析CSV格式的账单文件

        参数:

            csv_file_path: CSV账单文件路径(例:"./bill.csv"

        返回:

            统计结果字典(总支出、平均支出、分类统计等),出错则返回None

        """

        # 初始化统计变量

        total_amount = 0.0  # 总支出

        record_count = 0    # 消费记录条数

        category_total = {} # 分类统计:key=分类名,value=该分类总金额

        required_columns = ["日期", "分类", "金额"]  # 必须包含的列

        # 1. 验证文件是否存在

        if not os.path.exists(csv_file_path):

            print(f"❌ 错误:账单文件 '{csv_file_path}' 不存在!")

            return None

        if not csv_file_path.endswith(".csv"):

            print(f"❌ 错误:'{csv_file_path}' 不是CSV文件!")

            return None

        # 2. 读取CSV文件并统计

        try:

            with open(csv_file_path, mode='r', encoding='utf-8') as file:

                # DictReader读取,每行数据按列名存储(方便获取分类”“金额

                reader = csv.DictReader(file)

                # 检查CSV文件是否包含必需的列

                for col in required_columns:

                    if col not in reader.fieldnames:

                        print(f"❌ 错误:CSV文件缺少必需的列 '{col}'")

                        return None

                # 遍历每一条消费记录

                for row_num, row in enumerate(reader, start=2):  # row_num2开始(表头是1行)

                    record_count += 1

                    # 获取当前记录的分类和金额

                    category = row["分类"].strip()

                    amount_str = row["金额"].strip()

                    # 3. 转换金额为数字(处理非数字金额)

                    try:

                        amount = float(amount_str)

                        if amount < 0:

                            print(f"ℹ️ 提示:第{row_num}行金额为负数({amount}),按正数统计。")

                            amount = abs(amount)

                    except ValueError:

                        print(f"❌ 错误:第{row_num}行金额 '{amount_str}' 不是有效数字,跳过该记录。")

                        record_count -= 1  # 跳过的记录不计入总数

                        continue

                    # 4. 累加总金额和分类金额

                    total_amount += amount

                    # 更新分类统计:如果分类已存在,累加金额;否则新增分类

                    if category in category_total:

                        category_total[category] += amount

                    else:

                        category_total[category] = amount

            # 5. 计算衍生统计数据(避免除以零)

            avg_amount = total_amount / record_count if record_count > 0 else 0.0

            # 计算各分类占比(保留2位小数)

            category_ratio = {}

            for cat, amt in category_total.items():

                ratio = (amt / total_amount) * 100 if total_amount > 0 else 0.0

                category_ratio[cat] = round(ratio, 2)

            # 6. 整理统计结果

            result = {

                "总支出": round(total_amount, 2),

                "记录条数": record_count,

                "平均每次支出": round(avg_amount, 2),

                "分类支出": category_total,

                "分类占比(%)": category_ratio

            }

            return result

        except Exception as e:

            print(f"❌ 读取账单文件时出错:{e}")

            return None

    # 主程序:输出统计报告

    if __name__ == "__main__":

        print("=" * 30)

        print("      Python 账单统计工具")

        print("=" * 30)

        # 账单文件路径(和代码同一目录,直接用文件名)

        bill_file = "./bill.csv"

        # 调用统计函数

        stats_result = analyze_bill(bill_file)

        # 输出统计结果

        if stats_result:

            print("\\n📊 账单统计报告")

            print("-" * 20)

            print(f"总支出:{stats_result['总支出']} ")

            print(f"消费记录条数:{stats_result['记录条数']} ")

            print(f"平均每次支出:{stats_result['平均每次支出']} ")

            print("\\n📋 各分类支出统计:")

            # 按支出金额从大到小排序输出分类

            sorted_categories = sorted(stats_result['分类支出'].items(), key=lambda x: x[1], reverse=True)

            for cat, amt in sorted_categories:

                ratio = stats_result['分类占比(%)'][cat]

                print(f"  {cat}{amt} 元(占比 {ratio}%")

    4. 运行步骤

  • 按上面的格式创建 bill.csv 文件(或用自己的账单,确保列名包含 “日期、分类、金额”);
  • bill.csv 和代码文件放在同一目录;
  • 运行代码,即可看到统计报告(总支出、各分类占比等)。
  • 5. 拓展建议

  • 按日期筛选:统计 “10 月份餐饮支出” 或 “每周支出”;
  • 生成可视化图表:用 matplotlib 库画分类支出饼图(需安装:pip install matplotlib);
  • 写入统计结果:把统计报告保存到 bill_report.txt 文件中。
  • 总结:实战项目的核心价值

    这 3 个项目分别覆盖了 Python 入门的 3 个核心场景:

  • 计算器:巩固函数、循环、异常处理(基础逻辑);
  • 批量改文件名:掌握 os 模块(文件操作,实用工具);
  • 账单统计:学会 csv 模块(数据处理,贴近实际需求)。
  • 每个项目都能直接用在生活中,比如用批量改文件名整理照片,用账单统计管理开支。建议先跑通完整代码,再根据 “拓展建议” 自己修改功能 —— 比如给计算器加开方运算,给账单统计加图表,这样才能真正把知识变成技能。

    如果运行代码时遇到问题(比如路径错误、CSV 格式不对),可以把错误信息告诉我,我会帮你分析解决!

    赞(0)
    未经允许不得转载:171主机测评 » Python 入门实战:3 个小项目练手(附完整代码)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址