Python文件进阶:一维数据与 CSV 文件读写

目录

一、什么是一维数据?

[二、一维数据 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 种主流分隔写法,各有优缺点:

  1. 空格分隔 :北京 上海 天津 重庆
    缺点:数据内部不能自带空格,拆分时会错乱
  2. 换行分隔
    北京
    上海
    天津
    重庆
    优点:阅读直观,缺点占用更多文件行数
  3. 自定义特殊符号分隔 :北京 ¥ 上海 ¥ 天津 ¥ 重庆
    适合数据自带逗号、空格的特殊场景
  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() → 完整字符串写入文件

结合成绩统计实战,把之前学的列表、循环、文件基础语法全部串联,日常清单、分数、名称批量存储场景都可以直接复用这套代码。

相关推荐
Tyler_TXZ1 小时前
C++C语言之——二叉树
c语言·开发语言·数据结构·c++·二叉树
不会代码的小猴2 小时前
C++新增关键字
开发语言·c++·笔记
yaoxin5211232 小时前
497. Java 反射 - 使用反射读取注解
java·开发语言·python
2019一路前行2 小时前
Python 函数式编程
开发语言·python
专注仿真2 小时前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法
冯汉栩3 小时前
Swift Control View,Label渐变颜色(源码)
开发语言·ios·swift
从小就看凹凸曼^o^4 小时前
Python基础5 - 字典与集合:(1)字典
开发语言·python
Herbert_hwt4 小时前
第七章 Java深入理解枚举类型
java·开发语言·算法
侧耳倾听1114 小时前
java 日志框架简介
java·开发语言