10.4 二维数据的组织与处理
在现实世界中,数据往往不是一维序列,而是由多行多列组成的"表格"。
Python 的标准库 csv 和第三方库 pandas 都能高效地处理这类文件。
10.4.1 二维数据的表示
二维数据可用嵌套列表或列表嵌套字典的结构表示。
示例:
ini
# 嵌套列表data = [ ["Epoch", "Loss", "Accuracy"], [1, 0.48, 0.83], [2, 0.46, 0.85], [3, 0.44, 0.87]]
# 列表嵌套字典records = [ {"Epoch": 1, "Loss": 0.48, "Accuracy": 0.83}, {"Epoch": 2, "Loss": 0.46, "Accuracy": 0.85}, {"Epoch": 3, "Loss": 0.44, "Accuracy": 0.87}]
说明:嵌套列表,更接近 CSV 的按行按列排列的数据。列表嵌套字典 ,更接近 JSON 或数据库中的"记录(Record)"。
10.4.2 二维数据的存储
(1)写入 CSV 文件
相关方法:
csv.writer(f)
创建 CSV 写入对象。
writer.writerow(data)
一次写入一行数据。
writer.writerows(data)
一次写入多行数据。
示例:
python
import csv
data = [ ["姓名", "成绩"], ["艾婉婷", 95], ["岳露珊", 88], ["鞠子舟", 92]]
with open("成绩表.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerows(data)
print("CSV 文件写入完成。")
生成的文件内容如下:
go
姓名,成绩艾婉婷,95岳露珊,88鞠子舟,92
说明:newline="" 可避免在 Windows 系统中写入空行。
(2)追加数据
示例:
python
import csv
with open("成绩表.csv", "a", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["尔理湴", 90])
提示:在实验记录或日志存储中,追加模式 'a' 常用于逐步写入新结果。
10.4.3 二维数据的读取
(1)按行读取
相关方法:
csv.reader(f)
按行读取 CSV 内容。会将所有字段读取为字符串,必要时需自行转换类型。
示例:
python
import csv
with open("成绩表.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) for row in reader: print(row)
输出:
css
['姓名', '成绩']['艾婉婷', '95']['岳露珊', '88']['鞠子舟', '92']['尔理湴', '90']
(2)以字典形式读取
相关方法:
csv.DictReader(f)
返回每行数据为字典,键为列名。
示例:
python
import csv
with open("成绩表.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: print(row["姓名"], row["成绩"])
输出:
go
艾婉婷 95岳露珊 88鞠子舟 92尔理湴 90
说明:这种方式适合处理列名已知的数据表,尤其是后续需按字段筛选或统计的情况。
10.4.4 二维数据的处理
在读取数据后,我们常需要进一步筛选、统计或可视化。
例 10.4.1:筛选高分学生
python
import csv
high_scores = []
with open("成绩表.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: if int(row["成绩"]) >= 90: high_scores.append(row["姓名"])
print("高分学生:", high_scores)
输出:
css
高分学生: ['艾婉婷', '鞠子舟', '尔理湴']
例 10.4.2:计算平均成绩
python
import csv
with open("成绩表.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) rows = list(reader) # 先将所有数据读取到列表中
# 打印每一行 for row in rows: print(row)
# 从列表中提取成绩 scores = [int(row["成绩"]) for row in rows]
avg = sum(scores) / len(scores)print(f"平均成绩:{avg:.2f}")
输出:
javascript
{'姓名': '艾婉婷', '成绩': '95'}{'姓名': '岳露珊', '成绩': '88'}{'姓名': '鞠子舟', '成绩': '92'}{'姓名': '尔理湴', '成绩': '90'}平均成绩:91.25
10.4.5 CSV 文件的进阶操作
在项目开发中,常需要对 CSV 进行更复杂操作,如排序、去重或多字段统计。
(1)按列排序
使用内置函数 sorted() 进行排序,返回一个列表。
python
import csv
with open("成绩表.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) data = sorted(reader, key=lambda x: int(x["成绩"]), reverse=True)
for row in data: print(row["姓名"], row["成绩"])
输出:
go
艾婉婷 95鞠子舟 92尔理湴 90岳露珊 88
(2)去除重复记录
结合集合(set)与列表以达到高效数据清洗的目的。
sql
import csv
unique_rows = []names_seen = set()
with open("成绩表.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: if row["姓名"] not in names_seen: unique_rows.append(row) names_seen.add(row["姓名"])
例 10.4.3:AI 实验结果统计器
在机器学习实验中,每轮训练结果常以 CSV 文件保存:
apache
Epoch,Loss,Accuracy1,0.48,0.832,0.46,0.853,0.44,0.87
编写程序计算平均准确率与最低损失:
python
import csv
with open("train_result.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) losses = [] accuracies = [] for row in reader: losses.append(float(row["Loss"])) accuracies.append(float(row["Accuracy"]))
print(f"最低损失:{min(losses):.2f}")print(f"平均准确率:{sum(accuracies)/len(accuracies):.2f}")
输出:
go
最低损失:0.44平均准确率:0.85
说明:
此示例模拟真实的 AI 训练日志分析过程。在科研或开发中,模型性能监控通常依赖类似的 CSV 文件分析脚本。
10.5 高维数据的组织与处理
当数据结构更复杂(如嵌套列表、嵌套字典)时,CSV 已难以表达,此时可使用 JSON(JavaScript Object Notation) 格式。
JSON 是一种轻量级数据交换格式,兼具可读性与层次结构表达能力。它在 AI、Web 接口与配置文件中被广泛使用。
(1)Python 与 JSON 的对应关系
| JSON 类型 | Python 类型 |
|---|---|
| 对象(Object) | 字典(dict) |
| 数组(Array) | 列表(list) |
| 字符串(String) | 字符串(str) |
| 数值(Number) | int / float |
| 布尔值(Boolean) | bool |
| 空(null) | None |
(2)写入 JSON 文件
相关方法:
json.dump(obj, f, indent, ensure_ascii)
将 Python 对象写入 JSON 文件。
示例:
python
import json
config = { "model": "ResNet50", "learning_rate": 0.001, "batch_size": 32, "optimizer": "Adam", "layers": [64, 128, 256]}
with open("config.json", "w", encoding="utf-8") as f: json.dump(config, f, indent=4, ensure_ascii=False)
print("模型配置文件已保存。")
生成的 config.json 内容:
json
{ "model": "ResNet50", "learning_rate": 0.001, "batch_size": 32, "optimizer": "Adam", "layers": [64, 128, 256]}
(3)读取 JSON 文件
相关方法:
json.load(f)
从文件读取 JSON 并转换为 Python 对象。
示例:
python
import json
with open("config.json", "r", encoding="utf-8") as f: cfg = json.load(f)
print("读取的优化器:", cfg["optimizer"])print("网络层配置:", cfg["layers"])
输出:
css
读取的优化器: Adam网络层配置: [64, 128, 256]
10.6 文件综合示例与应用
文件操作是 Python 应用中最常见、也最具实用价值的技能之一。
无论是保存日志、归档实验结果,还是记录系统配置与统计报告,都离不开对文件的读取、写入与格式化处理。
例 10.6.1:AI 训练日志归档器
功能描述:自动读取 AI 模型的训练日志文件,提取关键信息(Epoch、Loss、Accuracy),并生成结构化 CSV 文件,便于后续分析。
示例日志文件 train.log 内容:
apache
Epoch 1: Loss=0.48 Accuracy=0.83Epoch 2: Loss=0.46 Accuracy=0.85Epoch 3: Loss=0.44 Accuracy=0.87
示例代码:
python
import csv
def log_to_csv(log_file, csv_file): """读取训练日志并输出为 CSV 文件""" with open(log_file, "r", encoding="utf-8") as f: lines = f.readlines()
# 解析有效行 records = [] for line in lines: if "Epoch" in line: parts = line.strip().split() epoch = int(parts[1].replace(":", "")) loss = float(parts[2].split("=")[1]) acc = float(parts[3].split("=")[1]) records.append([epoch, loss, acc])
# 写入 CSV 文件 with open(csv_file, "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["Epoch", "Loss", "Accuracy"]) writer.writerows(records)
print(f"日志已归档至 {csv_file}")
log_to_csv("train.log", "result.csv")
生成的 result.csv 文件内容:
apache
Epoch,Loss,Accuracy1,0.48,0.832,0.46,0.853,0.44,0.87
说明:
此程序模拟 AI 训练日志归档的自动化过程,可在模型训练结束后快速生成分析用表格。
例 10.6.2:学生成绩报告生成器
功能描述:从 CSV 成绩文件读取学生信息,计算平均分与等级,并导出 JSON 格式的成绩报告。
python
import csv, json
def generate_report(csv_file, json_file): """从 CSV 生成成绩报告(JSON)""" students = []
with open(csv_file, "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: name = row["姓名"] score = int(row["成绩"]) grade = "A" if score >= 90 else "B" if score >= 80 else "C" students.append({"姓名": name, "成绩": score, "等级": grade})
with open(json_file, "w", encoding="utf-8") as f: json.dump(students, f, indent=4, ensure_ascii=False)
print(f"成绩报告已保存为 {json_file}")
generate_report("成绩表.csv", "report.json")
生成的 report.json 文件内容:
json
[ { "姓名": "艾婉婷", "成绩": 95, "等级": "A" }, { "姓名": "岳露珊", "成绩": 88, "等级": "B" }, { "姓名": "鞠子舟", "成绩": 92, "等级": "A" }, { "姓名": "尔理湴", "成绩": 90, "等级": "A" }]
说明:
该示例展示了 CSV → JSON 的数据流转换过程,是文件格式化与数据清洗的典型应用。类似逻辑可应用于教学管理系统、考核统计或数据可视化项目。
例 10.6.3:模型配置加载与训练结果更新
功能描述:读取 JSON 格式的模型配置文件,动态更新参数并保存新的配置;同时,将训练结果追加至文本文件以备后续可视化分析。
python
import json
# 读取现有配置with open("config.json", "r", encoding="utf-8") as f: config = json.load(f)
# 更新超参数config["learning_rate"] *= 0.9config["last_epoch"] = config.get("last_epoch", 0) + 1
# 保存更新后的配置with open("config.json", "w", encoding="utf-8") as f: json.dump(config, f, indent=4, ensure_ascii=False)
# 将结果记录至日志with open("train_result.txt", "a", encoding="utf-8") as f: f.write(f"Epoch {config['last_epoch']} | lr={config['learning_rate']}\n")
print("配置与结果已更新。")
说明:
该程序模拟了机器学习项目中最常见的文件交互场景,包括配置更新与实验记录。
📘 小结
本次课讲解了二维和高维数据的文件操作,包括 CSV 与 JSON 的读写、筛选、排序与格式转换。通过综合示例展示了实验日志归档、成绩报告生成以及模型配置管理的实际应用。
下一阶段将进入 Python 面向对象编程的学习,了解类、对象与方法的定义与使用,为构建可复用的程序模块打下基础。

"点赞有美意,赞赏是鼓励"