目录
[二、一维数据 4 种文件存储格式](#二、一维数据 4 种文件存储格式)
[2.1 CSV 重点介绍](#2.1 CSV 重点介绍)
[三、CSV 一维数据读取(文件→列表)](#三、CSV 一维数据读取(文件→列表))
[3.1 完整基础代码:](#3.1 完整基础代码:)
[3.2 with 自动关闭优化版(推荐)](#3.2 with 自动关闭优化版(推荐))
[四、CSV 一维数据写入(列表→文件)](#四、CSV 一维数据写入(列表→文件))
[4.1 基础完整代码:](#4.1 基础完整代码:)
[4.2 追加写入示例(a 模式)](#4.2 追加写入示例(a 模式))
[五、综合实战 :成绩存储与平均分计算](#五、综合实战 :成绩存储与平均分计算)
[5.1 需求](#5.1 需求)
[5.2 完整分步代码](#5.2 完整分步代码)
[5.2.1 步骤 1:写入成绩 CSV](#5.2.1 步骤 1:写入成绩 CSV)
[5.2.2 步骤 2:读取数据、计算平均分](#5.2.2 步骤 2:读取数据、计算平均分)
[5.2.3 步骤 3:将结果写入 txt 文档](#5.2.3 步骤 3:将结果写入 txt 文档)
[六、遍历 CSV 每行数据](#六、遍历 CSV 每行数据)
上一章我们学会了基础 txt 文本的打开、读取、写入与关闭,能独立处理纯文字笔记、诗词类文件。但日常工作里,我们经常需要批量存储一组同类数据,比如城市名单、各科成绩单,直接写大段文字不方便提取、统计。今天我们就学习一维结构化数据的存储规范,重点讲解通用 CSV 逗号分隔文件的读写方案,把列表和文件操作结合起来,实现数据永久保存与读取。
一、什么是一维数据?
生活随处可见一维数据指线性平铺、只有一层结构的数据,不一定物理上只能一行(CSV 可以多行,每行独立一组一维数据),没有多层分类:
- 例子 1:国内直辖市名单:北京、上海、天津、重庆
- 例子 2:学生三科成绩:89、95、88
- 例子 3:购物清单:牛奶、面包、鸡蛋、可乐
在 Python 代码里,一维数据统一用列表存储;如果不需要重复元素,也可以用集合存放。
python
# 列表存储有序一维城市数据
city_list = ["北京", "上海", "天津", "重庆"]
# 集合存储无序一维城市数据(元素不重复)
city_set = {"北京", "上海", "天津", "重庆"}
二、一维数据 4 种文件存储格式
把一维数据存入 txt 文件,有 4 种主流分隔写法,各有优缺点:
- 空格分隔 :北京 上海 天津 重庆
缺点:数据内部不能自带空格,拆分时会错乱 - 换行分隔
北京
上海
天津
重庆
优点:阅读直观,缺点占用更多文件行数 - 自定义特殊符号分隔 :北京 ¥ 上海 ¥ 天津 ¥ 重庆
适合数据自带逗号、空格的特殊场景 - 英文逗号分隔(CSV 标准格式):北京,上海,天津,重庆
2.1 CSV 重点介绍
CSV 全称逗号分隔值,是全世界通用轻量表格格式,Excel、WPS、记事本全都能直接打开,所有数据分析工具完美兼容,也是我们本章重点掌握的格式。
三、CSV 一维数据读取(文件→列表)
核心逻辑:打开文件读取完整字符串,用逗号分割,直接转为列表。
3.1 完整基础代码:
python
# 打开 CSV 文件进行读取操作
file_handle = open("city.csv", "r", encoding="utf-8")
# 读取文件全部内容,去除末尾换行符
file_content = file_handle.read().strip("\n")
# 使用逗号分割字符串,转换为列表
city_list = file_content.split(",")
# 关闭文件
file_handle.close()
# 打印结果
print(city_list)
# 输出:['北京', '上海', '天津', '重庆']
3.2 with 自动关闭优化版
不用手动调用 close,代码更简洁安全:
python
# 使用 with 语句自动管理文件资源(推荐)
with open("city.csv", "r", encoding="utf-8") as file_handle:
# 读取文件内容并去除首尾空白字符
raw_text = file_handle.read().strip()
# 使用逗号分割字符串,得到城市列表
city_data = raw_text.split(",")
# 打印处理后的数据
print(city_data)
四、CSV 一维数据写入(列表→文件)
核心函数 :",".join(列表),把列表全部元素拼接成一条逗号分隔的完整字符串,再写入文件。
4.1 基础完整代码:
python
# 定义城市列表数据
city_list = ["北京", "上海", "天津", "重庆"]
# 使用逗号将列表元素拼接成字符串
csv_content = ",".join(city_list)
# 以写入模式打开 CSV 文件(会覆盖原有内容)
file_handle = open("city.csv", "w", encoding="utf-8")
# 写入内容并添加换行符
file_handle.write(csv_content + "\n")
# 关闭文件
file_handle.close()
写入后 city.csv 文件内内容:
北京,上海,天津,重庆
4.2 追加写入示例(a 模式)
如果需要新增城市,不用覆盖原有内容:
python
# 定义要追加的新城市数据
new_city = ["深圳"]
方案 A:先读取原有内容再合并(推荐,适合一维单行 CSV)
with open("city.csv", "r", encoding="utf-8") as f:
old = f.read().strip() # 读取原有内容并去除首尾空白
将原有内容按逗号分割,与新数据合并
all_data = old.split(",") + new_city
重新写入完整数据
with open("city.csv", "w", encoding="utf-8") as f:
f.write(",".join(all_data) + "\n")
方案 B:检查文件是否为空再追加(备选方案)
with open("city.csv", "r+", encoding="utf-8") as f:
content = f.read()
if content.strip(): # 文件非空
f.write("," + ",".join(new_city))
else: # 文件为空
f.write(",".join(new_city))
注意:r+ 模式读写指针默认在文件开头,如果原文件有多行数据,直接写入会覆盖内容
此方案仅适合单行一维 CSV 场景,不适合多行表格数据
五、综合实战 :成绩存储与平均分计算
5.1 需求
将科目 + 三次成绩:语文、89、95、88 写入 scoretest.csv
读取 csv 数据,计算三科平均分,保留两位小数
把「语文:xx.xx」结果写入 test.txt
5.2 完整分步代码
5.2.1 步骤 1:写入成绩 CSV
python
score_data = ["语文", "89", "95", "88"]
with open("scoretest.csv", "w", encoding="utf-8") as f:
line = ",".join(score_data)
f.write(line + "\n")
5.2.2 步骤 2:读取数据、计算平均分
python
with open("scoretest.csv", "r", encoding="utf-8") as f:
raw = f.read().strip()
info = raw.split(",")
# 拆分科目与分数
subject = info[0]
# 字符串转为数字
num1 = int(info[1])
num2 = int(info[2])
num3 = int(info[3])
avg = (num1 + num2 + num3) / 3
avg_2 = round(avg, 2)
print(f"{subject}:{avg_2}")
5.2.3 步骤 3:将结果写入 txt 文档
python
result_text = f"{subject}:{avg_2}"
with open("test.txt", "w", encoding="utf-8") as f:
f.write(result_text)
最终 test.txt 文件内容:
语文:90.67
六、遍历 CSV 每行数据
如果文件有多行一维数据,搭配 for 循环逐行处理:
python
with open("scoretest.csv", "r", encoding="utf-8") as f:
for line in f:
line = line.strip() # 清除换行、空格
row_data = line.split(",")
print("单行数据:", row_data)
七、避坑指南
- 分隔必须用英文半角逗号,中文逗号分割会读取错乱;
- join 只能拼接字符串列表,如果列表是数字,必须提前转字符串;
- 文件读写统一加 encoding="utf-8",中文不会出现乱码;
- split 分割后得到的全部是字符串,做加减运算需要 int/float 转换;
- w 模式会清空原有 CSV,追加数据务必使用 a 打开模式;
- 数据内容内部自带逗号时,不能直接用 CSV 基础写法,需要专业 csv 标准库处理。
补充:使用 Python 内置 csv 标准库安全处理带逗号的数据
当数据内容内部包含逗号、换行符等特殊字符时,使用基础的 split(",") 和 join() 方法会出错。Python 内置的 csv 模块能自动处理这些复杂情况:
python
import csv
示例数据:包含内部逗号的数据项
data = [
["姓名", "城市", "备注"],
["张三", "北京", "喜欢编程,游泳,读书"],
["李四", "上海", "擅长Python,Java"],
["王五", "广州", "备注中有换行符\n这是第二行"]
]
1. 使用 csv.writer 安全写入 CSV 文件
with open("data.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerows(data) # 写入多行数据
print("CSV 文件写入完成")
2. 使用 csv.reader 安全读取 CSV 文件
with open("data.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(f"读取到一行数据: {row}")
# 每行自动解析为列表,内部逗号不会错误分割
# 例如:['张三', '北京', '喜欢编程,游泳,读书']
csv 模块的核心优势:
- 自动处理字段内逗号:如果字段值包含逗号,csv.writer 会自动添加双引号包裹,csv.reader 能正确解析
- 处理换行符:字段内的换行符会被正确处理,不会破坏行结构
- 处理引号:自动转义字段内的双引号
- 跨平台兼容:正确处理不同操作系统的换行符差异
基础用法总结:
python
import csv
写入单行数据
with open("output.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["标题1", "标题2", "标题3"]) # 写入一行
writer.writerow(["数据1", "包含,逗号的数据", "数据3"]) # 自动处理逗号
读取所有数据
with open("output.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
all_rows = list(reader) # 转换为列表
print(all_rows)
当数据简单且确定不包含逗号、换行符时,可以使用基础的字符串分割方法。但处理真实数据(尤其是用户输入、网络爬取数据)时,强烈推荐使用 csv 标准库,避免数据解析错误。
八、本章小结
本章打通「列表一维数据」和「本地文件」的双向转换流程,掌握 CSV 通用格式读写两大核心操作:
- 读取:文件字符串 → split(",") → 列表
- 写入:列表 → ",".join() → 完整字符串写入文件
结合成绩统计实战,把之前学的列表、循环、文件基础语法全部串联,日常清单、分数、名称批量存储场景都可以直接复用这套代码。