Base Tools-Associate-Second:CSV库详解

第一归属:CSV(Comma-Separated Values)

csv 是 Python 内置的标准库,它解决了手动处理 CSV 时的诸多坑(比如字段包含逗号、换行符、引号等特殊情况),无需额外安装,是处理表格类文本数据的首选工具,专门用于处理 CSV(逗号分隔值)格式的文件

一、核心功能与基础用法

读取 CSV 文件

csv提供 csv.reader()csv.DictReader() 两种读取方式,后者更易用(按列名取值)

示例 1:基础读取(csv.reader)

python 复制代码
import csv

# 读取 CSV 文件(假设 test.csv 内容如下)
# 姓名,年龄,城市
# 张三,25,北京
# 李四,30,上海
# 王五,28,广州

# 方式1:csv.reader(返回列表形式的行)
with open('test.csv', 'r', encoding='utf-8') as f:
    # 创建 reader 对象
    reader = csv.reader(f)
    # 获取表头(第一行)
    header = next(reader)
    print("表头:", header)  # 输出:表头: ['姓名', '年龄', '城市']
    
    # 遍历每一行数据
    for row in reader:
        # row 是列表,通过索引取值
        name = row[0]
        age = row[1]
        city = row[2]
        print(f"姓名:{name},年龄:{age},城市:{city}")

示例 2:字典形式读取(csv.DictReader,推荐)

python 复制代码
import csv

with open('test.csv', 'r', encoding='utf-8') as f:
    # 创建 DictReader 对象,自动将第一行作为键
    reader = csv.DictReader(f)
    
    # 遍历每一行(行是字典,按列名取值)
    for row in reader:
        name = row['姓名']
        age = row['年龄']
        city = row['城市']
        print(f"姓名:{name},年龄:{age},城市:{city}")

写入 CSV 文件

对应csv.writer()csv.DictWriter() 两种写入方式

示例 1:基础写入(csv.writer)

python 复制代码
import csv

# 要写入的数据
data = [
    ['姓名', '年龄', '城市'],
    ['赵六', 32, '深圳'],
    ['孙七', 27, '杭州']
]

# 写入 CSV 文件(newline='' 避免每行多空行)
with open('output.csv', 'w', encoding='utf-8', newline='') as f:
    # 创建 writer 对象
    writer = csv.writer(f)
    # 写入单行(表头)
    writer.writerow(data[0])
    # 写入多行(数据)
    writer.writerows(data[1:])

示例 2:字典形式写入(csv.DictWriter,推荐)

python 复制代码
import csv

# 表头(键名)
fieldnames = ['姓名', '年龄', '城市']
# 要写入的数据(字典列表)
data = [
    {'姓名': '周八', '年龄': 29, '城市': '成都'},
    {'姓名': '吴九', '年龄': 31, '城市': '重庆'}
]

with open('output_dict.csv', 'w', encoding='utf-8', newline='') as f:
    # 创建 DictWriter 对象,指定表头
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    # 先写入表头
    writer.writeheader()
    # 写入多行数据
    writer.writerows(data)

二、进阶用法:处理特殊场景

自定义分隔符(如制表符 \t、分号;)

CSV 不一定用逗号分隔,比如欧洲常用分号,可通过 delimiter 参数指定

python 复制代码
import csv

# 读取分号分隔的 CSV
with open('semicolon.csv', 'r', encoding='utf-8') as f:
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        print(row)

# 写入制表符分隔的 CSV
with open('tab_sep.csv', 'w', encoding='utf-8', newline='') as f:
    writer = csv.writer(f, delimiter='\t')
    writer.writerow(['姓名', '年龄', '城市'])
    writer.writerow(['郑十', 26, '南京'])

处理带引号的字段

CSV 中如果字段包含逗号 / 换行符,会用引号包裹,csv 库会自动处理

python 复制代码
import csv

# 写入带特殊字符的字段
data = [
    ['姓名', '描述'],
    ['钱十一', '爱好:读书,跑步\n职业:程序员']  # 包含逗号和换行符
]

with open('quote_test.csv', 'w', encoding='utf-8', newline='') as f:
    writer = csv.writer(f, quoting=csv.QUOTE_ALL)  # 所有字段加引号
    writer.writerows(data)

# 读取验证(自动解析引号内的特殊字符)
with open('quote_test.csv', 'r', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row[1])  # 输出完整的描述,包含逗号和换行符

quoting 参数可选值:

  • csv.QUOTE_ALL:所有字段加引号
  • csv.QUOTE_MINIMAL:仅特殊字段(含分隔符 / 换行符)加引号(默认)
  • csv.QUOTE_NONNUMERIC:非数字字段加引号
  • csv.QUOTE_NONE:不加引号

读取 / 写入时转换数据类型

csv 读取的所有字段默认是字符串,可手动转换

python 复制代码
import csv

with open('test.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for row in reader:
        # 将年龄从字符串转为整数
        age = int(row['年龄'])
        print(f"{row['姓名']} 的年龄是 {age}(类型:{type(age)})")

三、常见坑与注意事项

  1. 编码问题 :中文 CSV 建议用 encoding='utf-8',如果读取乱码,可尝试 gbk/gb2312(Windows 生成的 CSV 常用)
  2. newline='' :写入时必须加 newline='',否则 Windows 系统下每行之间会多出一个空行
  3. 空值处理csv 库读取空字段会返回空字符串 '',需自行判断处理(比如转为 None
  4. 大文件处理csv 库是逐行读取 / 写入,内存占用低,适合处理大 CSV 文件(无需一次性加载全部数据)

总结

  1. csv 是 Python 内置库,无需安装,专门处理 CSV 文件,能自动处理特殊字符(逗号、引号、换行符)
  2. 核心用法分两类:reader/writer(列表形式)和 DictReader/DictWriter(字典形式,推荐,按列名取值更直观)
  3. 关键参数:delimiter 自定义分隔符、quoting 控制引号规则、写入时加 newline='' 避免空行,中文文件指定 encoding='utf-8'gbk
相关推荐
Sylvia33.4 分钟前
篮球数据API的技术架构与工程实践:基于火星数据WebSocket实时推送体系
java·python·websocket·网络协议·架构
DogDaoDao33 分钟前
【第10篇】Python 异常处理与调试入门
python·深度学习·ai·程序员·大模型·异常处理与调试
程序员雷欧1 小时前
Java 反射深度解析:从原理到源码的全面剖析
java·开发语言·python
我的xiaodoujiao1 小时前
快速学习Python基础知识详细图文教程18--多线程
开发语言·python·学习·测试工具
❀搜不到2 小时前
isat-sam分割导出掩码图
开发语言·python
Zane19942 小时前
ClassName() 只是一步?拆开看 __new__ 和 __init__ 各自在干什么
后端·python
曾阿伦3 小时前
Trae CN Python环境调试debug指南
开发语言·python
渣男教父3 小时前
Python游戏自动化实战案例
python·编程语言
天天爱吃肉82183 小时前
【工程师笔记|新能源整车电控一次过CISPR25/BCI,汽车EMC/EMI落地十大核心设计技巧】
大数据·人工智能·笔记·python·汽车
m0_617493943 小时前
Python 使用 cryptography 实现数据加密与解密
开发语言·python