当前位置: 首页 > news >正文

寒假学习笔记2.2

一、实践练习
练习1:简易日记本程序
python
import datetime
import os

class Diary:
def init(self, filename="diary.txt"):
self.filename = filename

def write_entry(self):"""写日记"""content = input("请输入日记内容:")timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")try:with open(self.filename, "a", encoding="utf-8") as f:f.write(f"\n--- {timestamp} ---\n")f.write(content + "\n")print("日记保存成功")except Exception as e:print(f"保存失败:{e}")def read_all(self):"""阅读所有日记"""if not os.path.exists(self.filename):print("还没有日记")returntry:with open(self.filename, "r", encoding="utf-8") as f:content = f.read()print(content if content else "日记为空")except Exception as e:print(f"读取失败:{e}")def search(self, keyword):"""搜索日记"""try:with open(self.filename, "r", encoding="utf-8") as f:lines = f.readlines()results = []i = 0while i < len(lines):if lines[i].startswith("---"):date_line = lines[i]content = lines[i+1] if i+1 < len(lines) else ""if keyword in content:results.append((date_line.strip(), content.strip()))i += 2else:i += 1if results:print(f"找到{len(results)}条包含'{keyword}'的日记:")for date, entry in results:print(f"{date}\n{entry}\n")else:print("未找到相关日记")except Exception as e:print(f"搜索失败:{e}")

主程序

diary = Diary()
while True:
print("\n=== 简易日记本 ===")
print("1. 写日记")
print("2. 阅读全部")
print("3. 搜索日记")
print("4. 退出")
choice = input("请选择:")

if choice == "1":diary.write_entry()
elif choice == "2":diary.read_all()
elif choice == "3":keyword = input("请输入搜索关键词:")diary.search(keyword)
elif choice == "4":break

练习2:JSON配置管理器
python
import json
import os

class ConfigManager:
def init(self, filename="config.json"):
self.filename = filename
self.config = {}
self.load()

def load(self):"""从文件加载配置"""if os.path.exists(self.filename):try:with open(self.filename, "r", encoding="utf-8") as f:self.config = json.load(f)except (json.JSONDecodeError, FileNotFoundError):print("配置文件损坏,使用默认配置")self.config = {}else:print("配置文件不存在,将创建新文件")def save(self):"""保存配置到文件"""try:with open(self.filename, "w", encoding="utf-8") as f:json.dump(self.config, f, indent=4, ensure_ascii=False)print("配置保存成功")except Exception as e:print(f"保存失败:{e}")def get(self, key, default=None):return self.config.get(key, default)def set(self, key, value):self.config[key] = valueself.save()def show(self):if self.config:print("当前配置:")for k, v in self.config.items():print(f"  {k}: {v}")else:print("配置为空")

使用示例

config = ConfigManager("app_config.json")
config.show()

while True:
print("\n1.查看配置 2.设置配置 3.删除配置 4.退出")
choice = input("请选择:")
if choice == "1":
config.show()
elif choice == "2":
key = input("键:")
value = input("值:")
config.set(key, value)
elif choice == "3":
key = input("要删除的键:")
if key in config.config:
del config.config[key]
config.save()
print("删除成功")
else:
print("键不存在")
elif choice == "4":
break
练习3:CSV成绩分析工具
python
import csv

def generate_scores_csv(filename="scores.csv", count=10):
"""生成随机成绩CSV文件"""
import random
names = ["小明", "小红", "小刚", "李华", "张伟", "王芳", "刘洋", "陈静", "赵磊", "孙丽"]
with open(filename, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["姓名", "语文", "数学", "英语"])
for i in range(count):
name = random.choice(names)
chinese = random.randint(60, 100)
math = random.randint(60, 100)
english = random.randint(60, 100)
writer.writerow([name, chinese, math, english])
print(f"已生成{count}条成绩记录到{filename}")

def analyze_scores(filename="scores.csv"):
"""分析成绩文件"""
try:
with open(filename, "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
scores = []
for row in reader:
scores.append({
"name": row["姓名"],
"chinese": int(row["语文"]),
"math": int(row["数学"]),
"english": int(row["英语"])
})

    if not scores:print("无数据")return# 统计各科平均分subjects = ["chinese", "math", "english"]subject_names = {"chinese": "语文", "math": "数学", "english": "英语"}averages = {}for sub in subjects:total = sum(s[sub] for s in scores)averages[sub] = total / len(scores)print("=== 成绩统计 ===")print(f"总人数:{len(scores)}")for sub in subjects:print(f"{subject_names[sub]}平均分:{averages[sub]:.1f}")# 找出总分前三for s in scores:s["total"] = s["chinese"] + s["math"] + s["english"]top3 = sorted(scores, key=lambda x: x["total"], reverse=True)[:3]print("\n总分前三名:")for i, s in enumerate(top3, 1):print(f"{i}. {s['name']}:总分{s['total']} (语文{s['chinese']} 数学{s['math']} 英语{s['english']})")except FileNotFoundError:print("成绩文件不存在,请先生成")
except Exception as e:print(f"分析出错:{e}")

主程序

while True:
print("\n=== 成绩分析工具 ===")
print("1. 生成随机成绩")
print("2. 分析成绩")
print("3. 退出")
choice = input("请选择:")
if choice == "1":
generate_scores_csv()
elif choice == "2":
analyze_scores()
elif choice == "3":
break
二、遇到的问题与解决
问题:写入CSV时出现多余空行

解决:open()时指定newline=''参数

问题:JSON写入中文变成Unicode转义序列

解决:json.dump(..., ensure_ascii=False)保留中文

问题:文件路径问题导致FileNotFoundError

解决:使用绝对路径或确保当前工作目录正确;也可使用os.path模块处理路径

问题:异常捕获顺序不当导致某些异常未被捕获

解决:先捕获具体异常,最后捕获通用Exception,避免except:裸捕获

问题:with语句中文件不存在时未处理

解决:将with放入try块中,捕获FileNotFoundError等

三、学习总结
文件操作是程序与外部数据交互的重要方式,with语句简化了资源管理

CSV适合表格数据,JSON适合结构化数据,是数据交换的常用格式

异常处理使程序更加健壮,能够优雅地处理错误情况

自定义异常可以提高代码的可读性和特定错误处理能力

文件操作与异常处理结合,可以构建可靠的数据持久化应用

http://www.jsqmd.com/news/390394/

相关文章:

  • 状压+dijk |floyd
  • 寒假学习笔记2.1
  • 并查集 - ## Find them, Catch them
  • (3-2)机器人身体结构与人体仿生学:人形机器人躯干体系
  • 气泡图标注软件中文版(美式功能设计)|一键插入序号气泡图,支持CAD/PDF/图片+OCR识别+Excel报告导出
  • EncodeConvert编码转换器v2.0——高效支持GBK与UTF-8互转的汉字编码工具
  • ZProtect一机一码工具(电脑版):专为DLL/EXE文件设计的轻量级软件开发解决方案
  • 未来之窗昭和仙君(七十二)前端交互异常行为检测—东方仙盟练气
  • 冥想第一千七百九十七天(1797)
  • 冥想第一千七百九十六天(1796)
  • ROS快速入门教程:什么是SLAM(Simultaneous localization and mapping,同步定位与建图)【解决机器人在未知环境运动时的定位与地图构建问题】
  • OpenTelemetry 开发实战【左扬精讲】—— 云原生可观测体系构建与分布式追踪二次开发
  • 工业园区全域轨迹拼接与异常行为智能识别平台——跨摄像单元轨迹连续性校验 × 多帧误差补偿引擎
  • Agentic AI时代,提示工程架构师的核心竞争力是什么?
  • 如何提升企业品牌在豆包结果中的排名? - 品牌2025
  • 寒假19
  • VSCode 配置 MinGW 搭建 C++ 开发环境
  • 基于SSM的蛋糕私人订制网站[SSM]-计算机毕业设计源码+LW文档
  • 领略大数据领域数据科学的数据清洗技巧
  • Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 4 —— 基于 Operator 实现大模型私有化部署与管理
  • 基于SSM的传智健康系统[SSM]-计算机毕业设计源码+LW文档
  • Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 3 —— 基于 Operator 实现 GPU 竞价实例资源池调度管理
  • 论文浅读(第一期)|摘自<<LOOpy Hell(ow):Infinite Traffic Loops at theApplication Layer>>(第三节) - 指南
  • Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 6 —— 基于运维专家知识库的智能故障诊断与排查 Operator 实战
  • Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 5 —— 基于大语言模型(LLM)的实时日志流智能监测 Operator 实现
  • HTML 脚本:构建交互式网页的基石
  • Scala IF...ELSE 语句详解
  • XSL 语言
  • 大数据领域时序分析:应对海量时间序列数据的挑战
  • Objective - C 在移动开发中的动画缩放与旋转