Python入门第三课:进阶编程技能: 文件操作与数据持久化
文件操作与数据持久化
1. 文件读写基础
# 写入文件
with open("diary.txt", "w", encoding="utf-8") as file:file.write("2023年10月15日\n")file.write("今天学会了Python文件操作!\n")file.write("这是一个重要的里程碑。\n")# 读取文件
print("=== 日记内容 ===")
with open("diary.txt", "r", encoding="utf-8") as file:content = file.read()print(content)# 逐行读取
print("\n=== 逐行读取 ===")
with open("diary.txt", "r", encoding="utf-8") as file:for line in file:print(line.strip()) # strip()移除换行符
2. CSV文件处理
import csv# 写入CSV文件
data = [["姓名", "年龄", "城市"],["张三", 25, "北京"],["李四", 30, "上海"],["王五", 28, "广州"]
]with open("people.csv", "w", newline="", encoding="utf-8") as file:writer = csv.writer(file)writer.writerows(data)# 读取CSV文件
print("\n=== CSV文件内容 ===")
with open("people.csv", "r", encoding="utf-8") as file:reader = csv.reader(file)for row in reader:print(f"{row[0]} | {row[1]}岁 | {row[2]}")
异常处理机制
1. 基本异常处理
# 除法计算器
while True:try:num1 = float(input("请输入被除数: "))num2 = float(input("请输入除数: "))result = num1 / num2print(f"结果: {result:.2f}")breakexcept ValueError:print("错误:请输入有效数字!")except ZeroDivisionError:print("错误:除数不能为零!")except Exception as e:print(f"发生未知错误: {e}")finally:print("-" * 30)
2. 自定义异常
class AgeError(Exception):"""年龄异常"""def __init__(self, age, message="年龄不合法"):self.age = ageself.message = messagesuper().__init__(self.message)def __str__(self):return f"{self.message}: {self.age}"# 验证年龄
def check_age(age):if age < 0:raise AgeError(age, "年龄不能为负数")elif age > 150:raise AgeError(age, "年龄超过人类极限")else:print(f"年龄 {age} 验证通过")# 测试异常
try:check_age(200)
except AgeError as e:print(e)
模块与包管理
1. 使用标准库模块
import math
import random
from datetime import datetime# 数学模块
print("圆周率:", math.pi)
print("平方根:", math.sqrt(16))# 随机模块
print("随机数:", random.randint(1, 100))
print("随机选择:", random.choice(["苹果", "香蕉", "橙子"]))# 日期时间
now = datetime.now()
print("当前时间:", now.strftime("%Y-%m-%d %H:%M:%S"))
2. 创建自定义模块
my_utils.py
def calculate_circle_area(radius):"""计算圆面积"""return 3.14159 * radius ** 2def celsius_to_fahrenheit(celsius):"""摄氏度转华氏度"""return celsius * 9/5 + 32
main.py
from my_utils import calculate_circle_area, celsius_to_fahrenheitprint(f"半径为5的圆面积: {calculate_circle_area(5):.2f}")
print(f"25摄氏度 = {celsius_to_fahrenheit(25):.1f}华氏度")
面向对象编程基础
1. 类与对象
class Dog:# 构造函数def __init__(self, name, breed, age):self.name = nameself.breed = breedself.age = age# 方法def bark(self):print(f"{self.name} 在汪汪叫!")def description(self):return f"{self.name}是一只{self.age}岁的{self.breed}"# 创建对象
my_dog = Dog("旺财", "金毛", 3)
friend_dog = Dog("小黑", "泰迪", 2)# 使用对象
print(my_dog.description())
my_dog.bark()print("\n" + friend_dog.description())
friend_dog.bark()
2. 继承与多态
class Animal:def __init__(self, name):self.name = namedef speak(self):passclass Cat(Animal):def speak(self):return "喵喵~"class Bird(Animal):def speak(self):return "叽叽喳喳!"# 多态示例
def animal_sound(animal):print(f"{animal.name} 说: {animal.speak()}")# 创建不同动物对象
animals = [Cat("小花猫"),Bird("小黄鸟")
]# 调用多态函数
for animal in animals:animal_sound(animal)
## 项目实践:学生成绩管理系统
import json
import osclass Student:def __init__(self, name, student_id):self.name = nameself.student_id = student_idself.grades = {}def add_grade(self, subject, grade):self.grades[subject] = gradedef average_grade(self):if not self.grades:return 0return sum(self.grades.values()) / len(self.grades)def __str__(self):grades_str = ", ".join([f"{k}: {v}" for k, v in self.grades.items()])return f"学生: {self.name} (学号: {self.student_id})\n成绩: {grades_str}\n平均分: {self.average_grade():.1f}"class GradeSystem:def __init__(self):self.students = {}self.load_data()def add_student(self, name, student_id):if student_id in self.students:print("该学号已存在!")return Falseself.students[student_id] = Student(name, student_id)self.save_data()return Truedef add_grade(self, student_id, subject, grade):if student_id not in self.students:print("学号不存在!")returnself.students[student_id].add_grade(subject, grade)self.save_data()def show_student(self, student_id):if student_id in self.students:print(self.students[student_id])else:print("找不到该学生")def save_data(self):data = {}for sid, student in self.students.items():data[sid] = {"name": student.name,"grades": student.grades}with open("grades.json", "w", encoding="utf-8") as f:json.dump(data, f, ensure_ascii=False, indent=2)def load_data(self):if os.path.exists("grades.json"):with open("grades.json", "r", encoding="utf-8") as f:data = json.load(f)for sid, info in data.items():student = Student(info["name"], sid)student.grades = info["grades"]self.students[sid] = studentdef main_menu():system = GradeSystem()while True:print("\n===== 学生成绩管理系统 =====")print("1. 添加学生")print("2. 添加成绩")print("3. 查看学生成绩")print("4. 退出系统")choice = input("请选择操作 (1-4): ")if choice == "1":name = input("请输入学生姓名: ")student_id = input("请输入学号: ")if system.add_student(name, student_id):print("学生添加成功!")elif choice == "2":student_id = input("请输入学号: ")subject = input("请输入科目: ")try:grade = float(input("请输入成绩: "))system.add_grade(student_id, subject, grade)print("成绩添加成功!")except ValueError:print("成绩必须是数字!")elif choice == "3":student_id = input("请输入学号: ")system.show_student(student_id)elif choice == "4":print("感谢使用成绩管理系统!")breakelse:print("无效选择,请重新输入")if __name__ == "__main__":main_menu()
Python学习路径图
练习任务
1. **日志记录器**:创建一个日志类,自动记录时间并将日志写入文件
2. **温度转换模块**:将之前的温度转换功能封装为模块,并添加异常处理
3. **银行账户系统**:使用OOP实现银行账户类,支持存款、取款和转账功能
4. **数据导出工具**:将学生成绩管理系统中的数据导出为CSV格式
> "面向对象编程让你可以用代码构建世界。" - Grady Booch
通过本课的学习,你已经掌握了Python的核心编程概念!接下来可以探索更高级的主题如正则表达式、数据库操作和Web开发框架。💻🚀