会了语法,就能“算”;会了数据处理,才能“用真实世界的数据算”。这一章我们从读写文件出发,学会处理 CSV / JSON,认识标准库,再借 pandas 体会“一行搞定一张表”的威力,最后用学生成绩分析把知识串成实战。
# 写文件(没有会自动创建)
with open("note.txt", "w", encoding="utf-8") as f:
f.write("码上问学\n")
f.write("Python 第4章\n")
# 读文件
with open("note.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
# 生活化:把购物清单“存”下来,再读出来
with open("shopping.txt", "w", encoding="utf-8") as f:
for item in ["牛奶", "鸡蛋", "面包"]:
f.write(item + "\n")
with open("shopping.txt", "r", encoding="utf-8") as f:
items = f.read().splitlines()
print("要买:", items)
print("共", len(items), "件")
# 实战片段:逐行读取并标注行号(处理日志/数据文件常用)
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("买菜\n取快递\n写作业\n")
with open("notes.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
for i, line in enumerate(lines, 1):
print(f"{i}. {line.strip()}")
import csv, json
# CSV:表格数据(逗号分隔)
rows = [["姓名", "分数"], ["张三", 90], ["李四", 85]]
with open("scores.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerows(rows)
# JSON:结构化的“键值”数据,前后端通用
data = {"class": "一班", "avg": 87.5, "top": ["张三", "李四"]}
with open("info.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 读回来
with open("info.json", "r", encoding="utf-8") as f:
back = json.load(f)
print(back["top"]) # ['张三', '李四']
import csv
# 生活化:记一笔每天的开支,再统计总支出
records = [
["日期", "项目", "金额"],
["10-01", "早餐", 12],
["10-01", "公交", 4],
["10-02", "午餐", 25],
]
with open("ledger.csv", "w", newline="", encoding="utf-8") as f:
csv.writer(f).writerows(records)
total = 0
with open("ledger.csv", "r", encoding="utf-8") as f:
for row in csv.reader(f):
if row[0] != "日期":
total += int(row[2])
print("总支出:", total, "元")
import json
# 实战片段:把程序设置存成 JSON,再读回来
config = {"主题": "深色", "字体": 14, "自动保存": True}
text = json.dumps(config, ensure_ascii=False)
print("保存为:", text)
back = json.loads(text)
print("读取主题:", back["主题"])
import os, datetime
print(os.getcwd()) # 当前目录
print(os.listdir(".")) # 当前目录下的文件列表
print(datetime.date.today()) # 今天日期
print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M")) # 格式化时间
import math
# 生活化:算一块圆形披萨的面积
r = 8
area = math.pi * r ** 2
print(f"半径 {r} 的披萨面积:{area:.1f}")
from collections import Counter
# 实战片段:统计一次投票结果(贴近项目里的“计数统计”)
votes = ["Python", "Java", "Python", "C++", "Python", "Java"]
result = Counter(votes)
print("各语言得票:", dict(result))
print("第一名:", result.most_common(1))
import pandas as pd
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"数学": [90, 85, 77],
"英语": [88, 92, 70],
})
print(df.mean(numeric_only=True)) # 每科平均分
print(df[df["数学"] > 80]) # 筛出数学 > 80 的行
# 生活化:记录一周步数,看看平均和达标天数
# (pandas 里一行:steps["步数"].mean() / steps[steps["步数"]>=10000])
data = [
("一", 8000), ("二", 12000), ("三", 6000),
("四", 11000), ("五", 9000),
]
vals = [v for _, v in data]
print("平均每天:", sum(vals) // len(vals))
达标 = [d for d in data if d[1] >= 10000]
print("达标天数:", len(达标))
import csv
# 实战片段:读一份成绩 CSV 并做“一行 pandas”的等效统计
# (pandas 等效:df = pd.read_csv("score.csv"); print(df.describe()))
rows = []
with open("score.csv", "w", newline="", encoding="utf-8") as f:
f.write("姓名,数学,英语\n张三,90,88\n李四,85,92\n王五,77,70\n")
with open("score.csv", "r", encoding="utf-8") as f:
for row in csv.DictReader(f):
rows.append((row["姓名"], int(row["数学"]), int(row["英语"])))
math_scores = [r[1] for r in rows]
eng_scores = [r[2] for r in rows]
print("数学:共", len(math_scores), "人 平均",
round(sum(math_scores)/len(math_scores), 1))
print("英语:共", len(eng_scores), "人 平均",
round(sum(eng_scores)/len(eng_scores), 1))
print("最高数学:", max(rows, key=lambda r: r[1])[0])
不依赖 pandas,用基础语法也能做分析:读入一份 CSV,算出每科平均分与全班总分最高的学生。这正是第 7 章“成绩可视化报告”的前身。
import csv
scores = []
with open("scores.csv", "r", encoding="utf-8") as f:
for row in csv.DictReader(f): # 每行自动变成 {列名: 值}
row["数学"] = int(row["数学"])
row["英语"] = int(row["英语"])
scores.append(row)
# 每科平均分
for subj in ["数学", "英语"]:
avg = sum(s[subj] for s in scores) / len(scores)
print(f"{subj} 平均分:{avg:.1f}")
# 总分最高
top = max(scores, key=lambda s: s["数学"] + s["英语"])
print("总分最高:", top["姓名"])
1写一个程序:把下面三位同学的成绩写入一个 CSV 文件(含表头“姓名,数学,英语”),再读回来,打印数学平均分和英语最高分的同学姓名。数据:小明 88/95、小红 92/80、小刚 75/88。
提示:写入用 csv.writer(...).writerows(...);读回用 csv.DictReader 把每行变成字典,再用 max(..., key=lambda r: ...) 找最高分。
import csv
# 参考答案:写入并分析成绩 CSV
data = [
["姓名", "数学", "英语"],
["小明", 88, 95],
["小红", 92, 80],
["小刚", 75, 88],
]
with open("grades.csv", "w", newline="", encoding="utf-8") as f:
csv.writer(f).writerows(data)
rows = []
with open("grades.csv", "r", encoding="utf-8") as f:
for r in csv.DictReader(f):
rows.append((r["姓名"], int(r["数学"]), int(r["英语"])))
math_avg = sum(r[1] for r in rows) / len(rows)
top_eng = max(rows, key=lambda r: r[2])
print(f"数学平均分:{math_avg:.1f}")
print("英语最高分:", top_eng[0])