• 时长: 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 是 Python collections 模块中的一个非常方便的工具,它是一个字典的子类,专门用来统计可哈希对象(如字符串、数字、元组)的出现次数。
  • 创建 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 文件,统计每个年龄段的学生有多少人。
  • 思考步骤:
    1. 使用 csv.DictReader 读取 CSV 文件,每行得到一个字典。
    2. 从每个学生字典中取出 ‘age’ (年龄) 的值。
    3. 将所有年龄值收集到一个列表中。
    4. 使用 Counter 统计列表中每个年龄的出现次数。
    5. 打印统计结果。
  • 代码实现:
    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.readercsv.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)。计算所有商品的总销售额(价格乘以销量再求和)。
  1. 本网站名称:系统驰云
  2. 本站永久网址:https://blog.xxyyo.com
  3. 本网站的内容均来源于网络,仅供大家学习与交流,如有侵权,请联系站长365919529@qq.com删除处理。
  4. 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
  5. 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
  6. 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。365919529@qq.com