Python实战项目,让你瞬间读懂Python!

Python实战项目,让你瞬间读懂Python! 学完 Python 基础语法后最关键的是 “用起来”—— 通过实战项目巩固知识才能真正掌握。今天的实战项目涵盖交互逻辑、文件操作、数据统计全部用 Python 内置库实现无需额外装包项目 1控制台计算器巩固函数 异常处理1. 项目需求支持 加减乘除 4 种基本运算能 连续计算算完一次后可继续算不用重启程序处理异常情况输入不是数字、除法除数为 0、输入无效运算符。2. 实现思路用 while True 实现连续计算按 q 退出用函数 calculate(num1, num2, op) 封装计算逻辑用 try-except 捕获输入错误非数字、除数为 0先获取用户输入的两个数字和运算符再调用计算函数最后输出结果。def calculate(): 执行数学运算并处理异常 try: num1 input(\n请输入第一个数字: ) operator input(\n运算符: ) num2 input(\n请输入第二个数字: ) num1 float(num1) num2 float(num2) if operator : return num1 num2 elif operator -: return num1 - num2 elif operator *: return num1 * num2 elif operator /: if num2 0: raise ZeroDivisionError(除数不能为零) #主动抛出异常 return num1 / num2 else: raise ValueError(不支持的运算符) except ValueError as e: raise ValueError(f数值错误: {e}) # 正确的调用位置在函数外部 result calculate() print(result)def calculate(num1, operator, num2): 执行数学运算并处理异常 try: num1 float(num1) num2 float(num2) if operator : return num1 num2 elif operator -: return num1 - num2 elif operator *: return num1 * num2 elif operator /: if num2 0: raise ZeroDivisionError(除数不能为零) return num1 / num2 else: raise ValueError(不支持的运算符) except ValueError as e: raise ValueError(f数值错误: {e}) def main(): 主程序循环 print(简易计算器输入q退出) while True: try: # 获取用户输入 num1 input(\n请输入第一个数字: ) if num1.lower() q: break operator input(请输入运算符(、-、*、/): ) if operator.lower() q: break num2 input(请输入第二个数字: ) if num2.lower() q: break # 执行计算 result calculate(num1, operator, num2) print(f结果: {num1} {operator} {num2} {result:.2f})#结果保留两位小数 except Exception as e: print(f错误: {e}) continue if __name__ __main__:#入口函数 也叫主函数 main()项目 2批量改文件名掌握文件操作1. 项目需求批量给文件夹里的文件加前缀 / 后缀例把 “1.jpg” 改成 “旅行_1.jpg”批量替换文件名中的字符例把 “2024_照片.jpg” 改成 “2025_照片.jpg”处理异常目标文件夹不存在、文件夹为空、文件重名。2. 实现思路用os模块操作文件os.listdir() 遍历文件、os.rename() 改文件名让用户选择 “加前缀 / 后缀” 或 “替换字符” 模式验证目标文件夹是否存在避免路径错误遍历文件时跳过文件夹只改文件不改子文件夹。import os #修改文件前后缀 def batch_rename_files(folder_path, mode, prefix, suffix): 批量修改文件名 参数 folder_path: 目标文件夹路径例C:/Photos 或 ./my_files mode: 操作模式1加前缀/后缀2替换字符 prefix: 前缀mode1时用 suffix: 后缀mode1时用加在文件名和扩展名之间 old_char: 要替换的旧字符mode2时用 new_char: 替换后的新字符mode2时用 # 1. 验证文件夹是否存在 if not os.path.exists(folder_path): print(f❌ 错误文件夹 {folder_path} 不存在) return # isdir专门用于检查路径是否为目录 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加前缀和后缀例name1, prefix旅行_, suffix_2024 → 旅行_1_2024.jpg new_name f{prefix}{name}{suffix}{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) # 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, mode1, prefixprefix, suffixsuffix) else: print(❌ 错误无效模式请输入 1 或 2。)import os #修改文件前后缀 def batch_rename_files(folder_path, mode, prefix, suffix,old_char, new_char): #def batch_rename_files(folder_path, mode, prefix, suffix): 批量修改文件名 参数 folder_path: 目标文件夹路径例C:/Photos 或 ./my_files mode: 操作模式1加前缀/后缀2替换字符 prefix: 前缀mode1时用 suffix: 后缀mode1时用加在文件名和扩展名之间 old_char: 要替换的旧字符mode2时用 new_char: 替换后的新字符mode2时用 # 1. 验证文件夹是否存在 if not os.path.exists(folder_path): print(f❌ 错误文件夹 {folder_path} 不存在) return # isdir专门用于检查路径是否为目录 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加前缀和后缀例name1, prefix旅行_, suffix_2024 → 旅行_1_2024.jpg new_name f{prefix}{name}{suffix}{ext} elif mode 2: # 模式2替换字符例name2024_照片 → 替换2024为2025 → 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, mode1, prefixprefix, suffixsuffix) elif mode 2: old_char input(请输入要替换的旧字符例2024).strip() new_char input(请输入替换后的新字符例2025).strip() if not old_char: print(❌ 错误要替换的旧字符不能为空) else: batch_rename_files(folder, mode2, old_charold_char, new_charnew_char) else: print(❌ 错误无效模式请输入 1 或 2。)准备一个文件夹例./my_photos放在代码文件同一目录下里面放几个测试文件如图片、文档运行代码输入文件夹路径相对路径直接输 ./my_photos绝对路径输 C:/Users/XXX/Desktop/my_photos选择模式比如选 1输入前缀 “旅行_”后缀 “_2024”即可批量修改。项目 3账单统计工具处理实际数据1. 项目需求读取 CSV 格式的账单文件日常消费记录含 “日期、分类、金额、备注”report.csv统计核心数据总支出、平均每次支出、各分类支出如餐饮、交通及占比处理异常账单文件不存在、文件格式错误、金额不是数字。2. 实现思路用 csv 模块读取 CSV 文件Python 内置无需装包用字典 category_total 统计各分类的总金额计算总支出、平均支出、分类占比用 try-except 处理文件读取和数据转换错误。import csv import os 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, moder, encodinggbk) 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, start2): # row_num从2开始表头是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}按正数统计。) print(第row_num行金额为负数) 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 def name(): print( * 30) print( Python 账单统计工具) print( * 30) # 账单文件路径和代码同一目录直接用文件名 #bill_fileinput(请输入文件路径) bill_file/report.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(), keylambda x: x[1], reverseTrue) for cat, amt in sorted_categories: ratio stats_result[分类占比(%)][cat] print(f {cat}{amt} 元占比 {ratio}%) #print(catewhue huwhe uwe ) # 主程序输出统计报告 if __name__ __main__: name()