🎯 本章你会学到:csv 模块与 pandas 快速上手,以及一道把全篇串起来的综合题。建议边读边敲,每节练习先自己做,再展开答案对照。
Python 最被低估的能力是“处理数据”:读表格、算统计、排个序、导出结果,几行就够。这一章用标准库 csv 和第三方库 pandas 各演示一遍。
标准库:csv
用 csv 解析表格文本
import csv
import io
import statistics
raw = """name,score
Ann,90
Bob,59
Cid,88
"""
rows = list(csv.DictReader(io.StringIO(raw)))
scores = [int(r["score"]) for r in rows]
print(len(scores), statistics.mean(scores))
print(max(rows, key=lambda r: int(r["score"]))["name"])运行结果
3 79
Ann
第三方:pandas
pandas 快速上手(需要 pip install pandas)
import pandas as pd
df = pd.DataFrame({"name": ["Ann", "Bob", "Cid"], "score": [90, 59, 88]})
print(f"{df['score'].mean():.2f}")
print(df[df["score"] >= 60]["name"].tolist())
print(df.sort_values("score", ascending=False)["name"].tolist())运行结果
79.00
['Ann', 'Cid']
['Ann', 'Cid', 'Bob']
对比一下:标准库版本要自己切分、转换、统计;pandas 一行 df["score"].mean() 就完了。数据量大、要反复筛选分组时,pandas 的效率优势非常明显——这也是博客里数据科学线的主线工具。
| 需求 | 标准库做法 | pandas 做法 |
|---|---|---|
| 读 CSV | csv.DictReader | pd.read_csv("a.csv") |
| 求平均 | statistics.mean([...]) | df["score"].mean() |
| 筛选 | 列表推导式 | df[df["score"] >= 60] |
| 排序 | sorted(..., key=...) | df.sort_values("score") |
| 分组统计 | 自己写字典累加 | df.groupby("name").sum() |
⚠️ 易错点 pandas 不是标准库,要先
pip install pandas;生产环境建议用虚拟环境(python -m venv .venv)隔离依赖。⚠️ 易错点 读 CSV 时中文乱码通常是编码问题:
pd.read_csv(path, encoding="utf-8") 或 "gbk" 试一下。✍️ 本节练习
8.1必做解析逗号分隔数据
读入 n 行「姓名,分数」(逗号分隔),输出人数、平均分(2 位小数)和按分数降序的姓名列表。
输入 第一行 n;接下来 n 行「姓名,分数」。
输出 三行:count=、avg=、rank=[...]。
样例输入
3
Ann,90
Bob,59
Cid,88样例输出
count=3
avg=79.00
rank=['Ann', 'Cid', 'Bob']💡 提示 用 input().split(",") 拆开,存成元组列表后排序。
✅ 查看参考答案与解析
n = int(input())
people = []
for _ in range(n):
name, score = input().split(",")
people.append((name, int(score)))
avg = sum(s for _, s in people) / len(people)
rank = [name for name, _ in sorted(people, key=lambda p: -p[1])]
print(f"count={len(people)}")
print(f"avg={avg:.2f}")
print(f"rank={rank}")解析 sorted(..., key=lambda p: -p[1]) 按分数降序;打印列表本身会带方括号和引号,这也是 Python 列表的标准表示。
8.2挑战文本统计(全篇综合)
读入一行英文文本,输出字符数、单词数,以及出现次数最多的 3 个单词(次数降序、同次数按字典序,格式 词 次数 用逗号加空格连接)。
输入 一行英文文本。
输出 三行:chars=、words=、top3=...。
样例输入
the quick brown fox the lazy dog the end样例输出
chars=40
words=9
top3=the 3, brown 1, dog 1💡 提示 切词 → 字典计数 → 排序取前 3 → 用 ", ".join(...) 拼接。
✅ 查看参考答案与解析
text = input()
words = text.split()
freq = {}
for w in words:
freq[w] = freq.get(w, 0) + 1
top = sorted(freq.items(), key=lambda kv: (-kv[1], kv[0]))[:3]
top_str = ", ".join(f"{w} {c}" for w, c in top)
print(f"chars={len(text)}")
print(f"words={len(words)}")
print(f"top3={top_str}")解析 这道题把整条 Python 线串起来了:字符串方法、字典、排序、推导式/生成器、f-string。写完它,Python 基础就算过关。