- 时长: 90 分钟
- 教学目标:
- 理解什么是 CSV (Comma Separated Values) 文件:一种存储表格数据的常用文本格式。
- 掌握如何使用 Python 的
csv
模块来读取 CSV 文件(以列表或字典的形式)。 - 了解如何使用
csv
模块来写入 CSV 文件。 - 学习
collections
模块中的Counter
工具:一种高效统计元素出现次数的字典子类。 - 掌握
Counter
的基本用法和常见操作。 - 能够结合文件操作、列表、字典、循环和
Counter
,对结构化数据进行读取、处理和统计分析。
课程内容
1. 复习与引入 (10 分钟)
- 复习: 快速回顾文件读写操作(
with open()
,read()
,readline()
,write()
,writelines()
)和try-except
错误处理。回顾列表和字典的使用。 - 提出问题: 老师提问:“我们之前学了怎么把学生信息保存到文本文件,一行一个学生,比如
小明,S001,12
。这种用逗号分隔的方式很常见,就像一个简单的表格。电脑里还有一种专门用来存表格数据的文件,叫做 CSV 文件。它有什么特点?怎么用 Python 更方便地读写它?” “另外,如果我有一大堆词语,我想快速统计每个词语出现了多少次怎么办?比如,一份调查问卷里收集了很多同学最喜欢的动物名字,我怎么快速知道‘猫’出现了多少次,‘狗’出现了多少次?” - 引出新知识: 今天,我们将学习如何处理CSV 文件,这是一种非常常见的表格数据格式。我们还将学习 Python 的一个强大工具
collections.Counter
,它可以高效地帮你统计任何东西的出现次数,就像一个专业的“点数器”。
2. 表格数据的好朋友 – CSV 文件 (25 分钟)
- 什么是 CSV?
- CSV 全称 Comma Separated Values,即“逗号分隔值”。
- 它是一种纯文本文件,用来存储表格数据(像 Excel 表格一样)。
- 每一行代表表格中的一条记录(一行数据)。
- 每行的字段(列)之间用逗号
,
分隔。 - 第一行通常是表头(列名)。
- 示例:
姓名,学号,年龄 小明,S001,12 小红,S002,13 小刚,S003,12
- 为什么用 CSV?
- 简单,纯文本,可以在任何文本编辑器中打开。
- 容易与其他程序交换数据(Excel、数据库等)。
- Python 的
csv
模块: Python 内置了一个csv
模块,专门用来方便地读写 CSV 文件。它比我们自己用split(',')
和join(',')
更强大和安全,因为它能处理逗号在数据中出现的情况(用引号包起来)。 - 读取 CSV 文件:
- 方法一:
csv.reader
(按行读取,每行是一个列表)import csv # 准备一个示例 CSV 文件 (手动创建 student_data.csv) # student_data.csv: # name,id,age # 小明,S001,12 # 小红,S002,13 # "李华,学生",S004,14 # 演示数据中含逗号的情况 print("--- 读取 CSV 文件 (csv.reader) ---") try: with open('student_data.csv', 'r', encoding='utf-8', newline='') as csvfile: # newline='' 很重要,防止空行 reader = csv.reader(csvfile) header = next(reader) # 读取第一行作为表头 print("表头:", header) # ['name', 'id', 'age'] for row in reader: # 每一行都是一个字符串列表 print("读取到一行数据 (列表形式):", row) # 比如:['小明', 'S001', '12'] # 比如:['李华,学生', 'S004', '14'] except FileNotFoundError: print("错误:'student_data.csv' 文件不存在!请手动创建它。")
- 方法二:
csv.DictReader
(按行读取,每行是一个字典) – 更推荐!import csv print("--- 读取 CSV 文件 (csv.DictReader) ---") try: with open('student_data.csv', 'r', encoding='utf-8', newline='') as csvfile: reader = csv.DictReader(csvfile) # 自动以第一行为键 for row_dict in reader: # 每一行都是一个字典 print("读取到一行数据 (字典形式):", row_dict) # 比如:{'name': '小明', 'id': 'S001', 'age': '12'} print(f"学生姓名: {row_dict['name']}, 年龄: {row_dict['age']}") except FileNotFoundError: print("错误:'student_data.csv' 文件不存在!")
DictReader
会自动使用 CSV 文件的第一行作为字典的键,非常方便。
- 方法一:
-
写入 CSV 文件:
import csv print("--- 写入 CSV 文件 ---") # 要写入的数据 (字典列表) students_to_write = [ {"name": "王强", "id": "S005", "age": 15}, {"name": "张丽", "id": "S006", "age": 14}, {"name": "赵老师", "id": "T001", "age": "40岁"} # 演示数据,age 故意写成字符串 ] # 定义表头 (键的顺序) fieldnames = ['name', 'id', 'age'] with open('new_students.csv', 'w', encoding='utf-8', newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() # 写入表头 writer.writerows(students_to_write) # 写入所有行 print("数据已写入 'new_students.csv' 文件。")
- 动手实践: 学生手动创建一个简单的
student_data.csv
文件。 尝试使用csv.DictReader
读取它,并打印每行数据。 尝试使用csv.DictWriter
将一些新的学生数据写入另一个 CSV 文件。
3. 高效统计的利器 – collections.Counter
(25 分钟)
- 提出问题: 如果有一个列表
fruits = ["apple", "banana", "apple", "cherry", "banana", "apple"]
,我想知道每种水果出现了多少次?我们可以用字典和循环来统计:# 传统方法统计 fruits = ["apple", "banana", "apple", "cherry", "banana", "apple"] fruit_counts = {} for fruit in fruits: if fruit in fruit_counts: fruit_counts[fruit] = fruit_counts[fruit] + 1 else: fruit_counts[fruit] = 1 print("传统方法统计结果:", fruit_counts)
这种方法没问题,但有点长。
collections.Counter
的概念:Counter
是 Pythoncollections
模块中的一个非常方便的工具,它是一个字典的子类,专门用来统计可哈希对象(如字符串、数字、元组)的出现次数。- 创建
Counter
对象: 可以直接传入一个列表(或其他可迭代对象)。from collections import Counter # 从 collections 模块导入 Counter # 使用 Counter 统计 fruits = ["apple", "banana", "apple", "cherry", "banana", "apple"] fruit_counter = Counter(fruits) print("Counter 统计结果:", fruit_counter) # 输出: Counter({'apple': 3, 'banana': 2, 'cherry': 1})
Counter
的常用操作:- 像字典一样访问:
print("苹果出现了:", fruit_counter["apple"], "次") print("橙子出现了:", fruit_counter["orange"], "次") # 不存在的元素返回 0,不报错
- 更新计数:
fruit_counter["banana"] = fruit_counter["banana"] + 1 # 像普通字典一样更新 fruit_counter["grape"] = 1 # 添加新元素 print("更新后:", fruit_counter)
elements()
: 返回所有元素,重复的元素会重复出现。print("所有元素 (包含重复):", list(fruit_counter.elements())) # 输出: ['apple', 'apple', 'apple', 'banana', 'banana', 'cherry', 'grape'] (顺序不固定)
most_common(n)
: 返回出现次数最多的 n 个元素及其计数(以元组列表形式)。print("出现次数最多的 2 种水果:", fruit_counter.most_common(2)) # 输出: [('apple', 3), ('banana', 2)]
- 加减操作 (像集合一样): 可以对两个
Counter
对象进行加减操作。c1 = Counter("aabbc") c2 = Counter("ccdde") print(c1 + c2) # Counter({'a': 2, 'b': 2, 'c': 3, 'd': 2, 'e': 1})
- 像字典一样访问:
- 动手实践: 学生使用
Counter
统计一个列表中数字的出现次数。 统计一个句子中每个字母的出现次数(忽略大小写和非字母字符)。 使用most_common()
找出出现最多的项。
4. 结合 CSV 和 Counter 进行数据分析 (15 分钟)
- 问题: 读取
student_data.csv
文件,统计每个年龄段的学生有多少人。 - 思考步骤:
- 使用
csv.DictReader
读取 CSV 文件,每行得到一个字典。 - 从每个学生字典中取出 ‘age’ (年龄) 的值。
- 将所有年龄值收集到一个列表中。
- 使用
Counter
统计列表中每个年龄的出现次数。 - 打印统计结果。
- 使用
- 代码实现:
import csv from collections import Counter print("--- CSV 文件年龄统计 ---") age_list = [] try: with open('student_data.csv', 'r', encoding='utf-8', newline='') as csvfile: reader = csv.DictReader(csvfile) for row_dict in reader: try: age_str = row_dict['age'] age = int(age_str) # 将年龄字符串转换为整数 age_list.append(age) except ValueError: print(f"警告:跳过无效年龄数据: {row_dict}") age_counts = Counter(age_list) print("各个年龄段的学生数量统计:") # 遍历 Counter 结果并打印 for age, count in age_counts.items(): print(f"年龄 {age} 岁:{count} 人") print("----------------------") except FileNotFoundError: print("错误:'student_data.csv' 文件不存在!")
- 动手实践: 学生跟着老师的例子,实现年龄统计。 尝试修改代码,统计学生学号中包含特定字符的数量。
5. 课堂练习 (15 分钟)
让学生独立完成以下练习:
- 练习 1: 编写一个程序,读取课堂上创建的
new_students.csv
文件,并打印出所有学生的姓名和学号。import csv # TODO: 使用 csv.DictReader 读取 new_students.csv # TODO: 遍历每行数据,打印姓名和学号
- 练习 2: 编写一个程序,有一个颜色列表
colors = ["red", "blue", "green", "red", "yellow", "blue", "red"]
。使用collections.Counter
统计每种颜色出现的次数,并打印出出现次数最多的颜色及其次数。 - 练习 3: 编写一个程序,假设有一个文本文件
words.txt
,里面有很多单词,每行一个单词。读取这个文件,统计文件中每个单词出现的次数,并找出出现次数最多的 5 个单词及其次数。
6. 总结与提问 (5 分钟)
- 回顾: 回顾本节课内容:CSV 文件的概念和格式,如何使用
csv.DictReader
读取 CSV 文件(推荐),如何使用csv.DictWriter
写入 CSV 文件,collections.Counter
的作用和基本操作 (most_common()
),以及如何结合这些工具进行数据处理和统计。 - 提问:
- CSV 文件是什么格式?它有什么特点?
csv.reader
和csv.DictReader
读取 CSV 文件有什么区别?哪个更方便?collections.Counter
主要用来做什么?- 如何使用
Counter
找出列表中出现次数最多的元素? - 在处理表格数据时,
csv
模块和Counter
模块可以帮助我们做什么?
- 答疑: 回答学生问题。
7. 布置课后作业 (5 分钟)
- 作业 1: 创建一个列表,存放你和同学的几门科目的分数(例如,每个元素是字典
{"name": "小明", "math": 90, "chinese": 85}
)。将这些数据写入一个 CSV 文件grades.csv
。然后尝试用DictReader
读回来并打印。 - 作业 2: 编写一个程序,读取
grades.csv
文件。- 统计并打印每个学生数学课的平均分。
- 找出数学分数最高的学生及其分数。
- 作业 3: 编写一个程序,模拟一个简单的投票系统。
- 创建一个空的
Counter
对象。 - 让用户循环输入他们投票的选项(例如:
A
,B
,C
),输入exit
退出。 - 每输入一个选项,就更新
Counter
中的计数。 - 退出后,打印出每个选项的最终投票数。
- 创建一个空的
- 作业 4: (选做) 编写一个程序,读取一个 CSV 文件(例如,包含商品名称、价格、销量的
sales.csv
)。计算所有商品的总销售额(价格乘以销量再求和)。
- 本网站名称:系统驰云
- 本站永久网址:https://blog.xxyyo.com
- 本网站的内容均来源于网络,仅供大家学习与交流,如有侵权,请联系站长365919529@qq.com删除处理。
- 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
- 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
- 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。365919529@qq.com
评论(0)