Python 编程B17:文件(二)

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 面向对象编程的学习,了解类、对象与方法的定义与使用,为构建可复用的程序模块打下基础。

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

相关推荐
嫂子的姐夫32 分钟前
01-协程
爬虫·python·协程·多任务爬虫
西游音月34 分钟前
(10)功能实现:Qt实战项目之新建项目对话框
开发语言·qt
我爱鸢尾花34 分钟前
RNN公式推导、案例实现及Python实现
人工智能·python·rnn·深度学习·神经网络·算法
w***954935 分钟前
在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)
c语言·开发语言
ironinfo36 分钟前
C#性能优化随记
开发语言·性能优化·c#
无限进步_39 分钟前
基于顺序表的通讯录系统设计与实现
c语言·开发语言·数据结构·c++·后端·算法·visual studio
e***193541 分钟前
QoS质量配置
开发语言·智能路由器·php
lucky_syq42 分钟前
深入Spark核心:Shuffle全剖析与实战指南
大数据·分布式·python·spark
宠..1 小时前
使用纯代码设计界面
开发语言·c++·qt