跳转至

15.1 数据处理与可视化:电子表格

内容梗概

本课是"数据处理与可视化"章节的第一课,从日常最常见的数据载体——表格——切入,讲解用 Python 处理表格数据的两种轻量级方式:一是用内置的 csv 库处理 CSV 文件,二是用第三方库 openpyxl 处理 Excel(.xlsx)文件。老师强调本章节讲得很浅,主要目的是练习 Python 的用法和养成查官方文档的习惯,真正的数据分析还有大量内容要学。课上演示了读取 CSV 的两种写法(csv.reader 和 csv.DictReader)以及用 openpyxl 读取 Excel 的基本流程。

知识点详解

数据处理与表格(约 00:00 - 02:00)

  • 数据处理最常见的形式是表格:日常工作中的 Excel、关系型数据库中的 table 本质上都是二维表格(不讨论图数据库、NoSQL)。
  • 本课程只讲最基本的库和用法:pandas 处理表格、matplotlib 画图,不涉及更深入的数据处理算法和丰富的可视化库。
  • 两种典型场景:学过 Python 但非数据分析专业的人,想自动处理一批表格(查错、自动计算);最直观的两种方式是处理 CSV 格式和处理 Excel 格式。

CSV 格式与内置 csv 库(约 02:20 - 05:30)

  • CSV 本质是**纯文本文件**,与 txt 一样,用 VSCode 打开能看到内容;以特定字符作为分隔符,默认是逗号分隔(如 id,name,age 一行、1,小董,18 一行)。
  • CSV 的第一行通常是表头,表明每一列的含义;也存在没有表头的 CSV,但那样需要自己猜测每列含义,一般应该有表头。
  • Python 内置 csv 库,无需 pip install 即可处理 CSV。
  • 处理 Excel 文件的第三方库有多个:本课选用 openpyxl(open + py + xl,开源的 Python Excel 库);此外还有 xlrd(Read)、xlwt(Write)等。

用 csv.reader 读取 CSV(约 11:00 - 18:00)

  • 官方文档示例的读法:
import csv
with open('x.csv', newline='') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)
  • 注意:用 open() 打开 CSV 文件时必须传 newline=''(空字符串),这是文档的硬性要求。顺带讲解了 newline 参数与换行符的关系:Windows 文本换行符是 \r\n(回车+换行),Linux 下是 \n,VSCode 右下角可查看/切换当前文件的换行符类型。
  • csv.reader 的分隔符等参数在默认情况下(逗号分隔)不需要传。
  • 迭代 reader 对象得到的每一行 row 是一个**列表**(老师课上先口误说成元组,随后更正)。
  • CSV 中逗号后的空格不会被自动忽略,需要自行处理,两种方法:
  • str.replace(' ', '') 把空格替换为空字符;
  • str.strip() 去掉首尾空白。
  • 该写法的缺陷:表头不会自动关联到数据,拿到的是"列表的列表",想按列名访问数据要手动处理,很费劲。

用 csv.DictReader 读取(约 19:00 - 24:00)

  • 文档中的 class csv.DictReader:自动把第一行表头作为 key,每行数据组织成 key-value 形式。
  • 版本差异:Python 3.8 起 DictReader 返回的行是 dict 类型;3.7 及以前返回的是 OrderedDict。老师为此把 Pipfile 中的 python_version 改为 3.8,再用 pipenv shell 进入 3.8 虚拟环境演示。
  • 用 DictReader 后可以方便地按列名取数,如 row['age'],配合循环可单独打印某一列(如所有人的年龄)。
  • 数据文件中若引号、空格影响键名,最简单的办法是在 VSCode 里 Ctrl+H 全文替换掉,不影响读取。
  • 应用场景:上节课爬虫爬下来的数据存在 CSV 里,用这套逻辑读进 Python 就是"字典组成的列表",每个字典对应一行,后续处理很方便。

用 openpyxl 处理 Excel(约 24:40 - 32:00)

  • CSV 文件在 Windows 上默认用 Excel 打开,可以在 Excel 中"另存为"得到 .xlsx 文件(Excel 2010 以后的格式)。
  • 安装:pipenv install openpyxl,然后 pipenv shell 进入环境。
  • 读取 Excel 的基本流程(约 27:30):
from openpyxl import load_workbook
wb = load_workbook('data.xlsx')   # workbook 是整个工作簿
ws = wb.active                    # worksheet,获取当前激活的表单
for row in ws.values:             # values 属性可遍历所有行
    print(row)                    # 每行是一个元组
  • 一个 Excel 文件可含多个子表单(worksheet),wb.active 取当前显示的那个。
  • 缺陷与 csv.reader 类似:第一行表头不会自动变成字典形式,需要可手动转换。
  • 写 Excel:文档示例是 Workbook() 创建新工作簿、取激活表单、给单元格赋值(如 ws['A1'] = 42)、append 添加行、最后 wb.save('xxx.xlsx') 保存。
  • 老师演示了"第一次用某库如何上手"的过程:打开官方文档 → 看示例代码判断是读还是写 → 在文档目录中找 "Loading from a file" 等对应章节 → 模仿示例写代码。反复强调**养成看官方文档的习惯**,优于看翻译不全的中文博客。

学以致用(约 32:00 - 33:16)

  • 接地气的例子:学习委员拿到 Excel 成绩单,用 Python 读进来自动计算,甚至给每个同学单独发邮件。老师当班主任时班级的中测成绩就是这样用 Python 算的。
  • 结课寄语:遇到生活中重复的工作要动手写代码,不要白学了 Python。

示例与演示

  • 演示 1(CSV 读取):下载课件提供的示例 CSV(18 条数据 + 表头,含 name、sex、age、身高、体重等列),用 csv.reader 逐行打印列表;再用嵌套循环演示 replace 与 strip 两种去空格方法(每个元素打印两遍对比效果)。
  • 演示 2(DictReader):切换 Pipfile 到 Python 3.8 环境,用 csv.DictReader 打印每行字典({'name': 'Alex', 'sex': 'M', 'age': '41', ...}),并演示按键名 row['age'] 单独输出整列;遇到键名带引号/空格的问题时用全文替换清洗数据。
  • 演示 3(Excel 读取):把 CSV 另存为 xlsx(课上还遇到一次文件损坏重新保存),pipenv install openpyxl 后用 load_workbook + wb.active + ws.values 打印所有行(元组形式)。
  • 演示 4(文档导读):现场演示如何通过 openpyxl 官方文档从"创建新表格"的示例推断出写文件流程,再从目录找到 "Loading from a file" 学会读文件。

重点与难点

  • open(csvfile, newline='') 中 newline='' 是文档硬性要求,容易遗漏。
  • csv.reader 读出的行是列表,csv.DictReader 读出的行是字典(3.8+);按列名处理数据时后者方便得多。
  • CSV 中逗号后的空格、引号会成为数据内容的一部分,需要清洗(replace/strip 或直接全文替换)。
  • 不同操作系统文本文件换行符不同(Windows \r\n vs Linux \n),与 newline 参数相关。
  • Pipfile 中可指定 python_version(如 3.8),pipenv shell 进入对应环境;库的版本差异(DictReader 返回类型)要留意文档备注。
  • 学习方法层面:不直接给代码,而是反复强化"查官方文档 → 模仿示例"的习惯。

关联内容

  • 承接上一章**爬虫**课程:爬取的数据存为 CSV,本课解决"爬下来之后怎么读、怎么处理"的问题。
  • 与 Web 开发章节逻辑类似:都是以浅显的应用场景练习 Python 用法。
  • 为后续课程铺垫:本课的 csv/openpyxl 是轻量方案;下一课(15.2)讲更强大的 pandas,再往后是 matplotlib 可视化(15.3)和综合实例(15.4)。
  • 前置知识:文件读写(open)、列表/字典/元组、循环、pipenv 虚拟环境管理(第 10 章)。