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
相关推荐
在世修行11 分钟前
干货:信号槽
python·信号槽
Wx-bishekaifayuan13 分钟前
springboot生活易购超市管理系统54086-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
数字融合21 分钟前
透明化数字孪生智慧养老平台运维服务项目
人工智能·python·virtualenv
smj2302_7968265222 分钟前
解决leetcode第4064题至多一次取反能被k整除的最长子数组II
python·算法·leetcode
happylifetree1 小时前
Python01-08:练习
python
空奈qwq1 小时前
ANN 全连接神经网络入门指南:从神经元到深度学习的第一步
人工智能·python·深度学习·神经网络·算法·机器学习
维克兜率天2 小时前
【维克】弹性策略:用“乖离率“捕捉超跌反弹
android·开发语言·python·深度学习·kotlin·量化
SamChan902 小时前
PDF页面旋转与CropBox陷阱:译文回填位置总是错位的根因实测
python·ai·pdf·wpf
程序员清风2 小时前
Java 智能体开发:从对话接口到任务执行
java·人工智能·python
2601_966949652 小时前
每日自动更新股票行情:如何设计可靠的数据任务,避免重复写入和脏数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash