Python CSV模块完全指南
编程小白也能轻松理解的CSV文件处理知识
什么是CSV文件?
CSV(Comma-Separated Values)是一种简单的文件格式,用来存储表格数据(如电子表格或数据库)。
想象一下Excel表格,CSV就是去掉所有格式(颜色、字体等)只保留数据的”简化版Excel”。
通俗解释:
把CSV文件想象成一本笔记本:
- 每一行 = 笔记本的一行
- 每个逗号 = 列之间的分隔线
- 没有复杂的格式,只有纯文本
# 一个简单的CSV文件内容示例:
姓名,年龄,城市
张三,25,北京
李四,30,上海
王五,28,”广州,广东” # 注意:当数据本身包含逗号时,需要用引号包裹
姓名,年龄,城市
张三,25,北京
李四,30,上海
王五,28,”广州,广东” # 注意:当数据本身包含逗号时,需要用引号包裹
为什么使用CSV模块?
Python内置了csv模块,专门用于处理CSV文件。相比手动处理(用字符串分割split(‘,’)),使用csv模块:
手动处理的问题 | csv模块的解决方案 |
---|---|
数据中包含逗号会被错误分割 | 自动处理带引号的字段 |
不同操作系统换行符不同 | 自动处理换行符差异 |
需要自己处理编码问题 | 提供编码参数处理不同字符 |
处理复杂CSV格式很麻烦 | 提供多种读取/写入方式 |
重要提示: 对于简单的CSV文件,手动处理可能可行,但使用csv模块更专业、更安全、更省心!
读取CSV文件
基本步骤:
- 打开CSV文件
- 创建csv.reader对象
- 遍历读取每一行
- 处理数据
- 关闭文件
import csv
# 1. 打开CSV文件(注意使用正确的编码)
with open(‘data.csv’, ‘r’, encoding=‘utf-8’) as file:
# 2. 创建CSV读取器
csv_reader = csv.reader(file)
# 3. 遍历每一行
for row in csv_reader:
# 4. 处理数据(每行是一个列表)
print(row) # 例如:[‘姓名’, ‘年龄’, ‘城市’]
# 5. 文件会自动关闭(with语句的功劳)
# 1. 打开CSV文件(注意使用正确的编码)
with open(‘data.csv’, ‘r’, encoding=‘utf-8’) as file:
# 2. 创建CSV读取器
csv_reader = csv.reader(file)
# 3. 遍历每一行
for row in csv_reader:
# 4. 处理数据(每行是一个列表)
print(row) # 例如:[‘姓名’, ‘年龄’, ‘城市’]
# 5. 文件会自动关闭(with语句的功劳)
重要提示: 使用with open()语句可以确保文件在使用后自动关闭,避免忘记关闭文件导致资源泄露!
写入CSV文件
基本步骤:
- 打开文件(写模式)
- 创建csv.writer对象
- 写入数据(单行或多行)
- 关闭文件
import csv
# 准备要写入的数据
data = [
[‘姓名’, ‘年龄’, ‘城市’],
[‘张三’, ’25’, ‘北京’],
[‘李四’, ’30’, ‘上海’],
[‘王五’, ’28’, ‘广州’]
]
with open(‘output.csv’, ‘w’, newline=”, encoding=‘utf-8’) as file:
# 创建CSV写入器
csv_writer = csv.writer(file)
# 写入所有数据
csv_writer.writerows(data)
# 也可以逐行写入:
# csv_writer.writerow([‘赵六’, ’35’, ‘深圳’])
# 准备要写入的数据
data = [
[‘姓名’, ‘年龄’, ‘城市’],
[‘张三’, ’25’, ‘北京’],
[‘李四’, ’30’, ‘上海’],
[‘王五’, ’28’, ‘广州’]
]
with open(‘output.csv’, ‘w’, newline=”, encoding=‘utf-8’) as file:
# 创建CSV写入器
csv_writer = csv.writer(file)
# 写入所有数据
csv_writer.writerows(data)
# 也可以逐行写入:
# csv_writer.writerow([‘赵六’, ’35’, ‘深圳’])
技巧: 在open()函数中添加参数newline=”可以避免在Windows系统上出现多余空行。
处理带标题行的CSV
当CSV文件包含标题行(第一行是列名)时,使用DictReader和DictWriter更方便:
DictReader(读取为字典)
import csv
with open(‘data_with_header.csv’, ‘r’, encoding=‘utf-8’) as file:
# 创建字典读取器
csv_dict_reader = csv.DictReader(file)
for row in csv_dict_reader:
# 每行是一个字典,可通过列名访问
print(f”姓名: {row[‘姓名’]}, 年龄: {row[‘年龄’]}, 城市: {row[‘城市’]}”)
with open(‘data_with_header.csv’, ‘r’, encoding=‘utf-8’) as file:
# 创建字典读取器
csv_dict_reader = csv.DictReader(file)
for row in csv_dict_reader:
# 每行是一个字典,可通过列名访问
print(f”姓名: {row[‘姓名’]}, 年龄: {row[‘年龄’]}, 城市: {row[‘城市’]}”)
DictWriter(写入字典数据)
import csv
# 准备数据(字典列表)
data = [
{‘姓名’: ‘张三’, ‘年龄’: ’25’, ‘城市’: ‘北京’},
{‘姓名’: ‘李四’, ‘年龄’: ’30’, ‘城市’: ‘上海’}
]
with open(‘output_with_header.csv’, ‘w’, newline=”, encoding=‘utf-8’) as file:
# 定义CSV的列名
fieldnames = [‘姓名’, ‘年龄’, ‘城市’]
# 创建字典写入器
csv_dict_writer = csv.DictWriter(file, fieldnames=fieldnames)
# 写入标题行
csv_dict_writer.writeheader()
# 写入数据
csv_dict_writer.writerows(data)
# 准备数据(字典列表)
data = [
{‘姓名’: ‘张三’, ‘年龄’: ’25’, ‘城市’: ‘北京’},
{‘姓名’: ‘李四’, ‘年龄’: ’30’, ‘城市’: ‘上海’}
]
with open(‘output_with_header.csv’, ‘w’, newline=”, encoding=‘utf-8’) as file:
# 定义CSV的列名
fieldnames = [‘姓名’, ‘年龄’, ‘城市’]
# 创建字典写入器
csv_dict_writer = csv.DictWriter(file, fieldnames=fieldnames)
# 写入标题行
csv_dict_writer.writeheader()
# 写入数据
csv_dict_writer.writerows(data)
优势: 使用字典方式访问数据,代码可读性更好,列顺序变化也不影响程序!
高级技巧与注意事项
自定义分隔符
不是所有CSV文件都用逗号分隔!有时会使用分号、制表符或其他字符。
# 读取用分号分隔的文件
with open(‘semicolon.csv’, ‘r’) as file:
csv_reader = csv.reader(file, delimiter=‘;’)
# 写入用制表符分隔的文件(TSV)
with open(‘tab_separated.tsv’, ‘w’, newline=”) as file:
csv_writer = csv.writer(file, delimiter=‘\t’)
with open(‘semicolon.csv’, ‘r’) as file:
csv_reader = csv.reader(file, delimiter=‘;’)
# 写入用制表符分隔的文件(TSV)
with open(‘tab_separated.tsv’, ‘w’, newline=”) as file:
csv_writer = csv.writer(file, delimiter=‘\t’)
处理引号和特殊字符
当数据包含逗号、引号或换行符时,csv模块会自动处理:
# 读取时处理引号
csv_reader = csv.reader(file, quoting=csv.QUOTE_MINIMAL)
# 写入时强制所有字段加引号
csv_writer = csv.writer(file, quoting=csv.QUOTE_ALL)
# 使用不同的引号字符
csv_writer = csv.writer(file, quotechar=“‘”)
csv_reader = csv.reader(file, quoting=csv.QUOTE_MINIMAL)
# 写入时强制所有字段加引号
csv_writer = csv.writer(file, quoting=csv.QUOTE_ALL)
# 使用不同的引号字符
csv_writer = csv.writer(file, quotechar=“‘”)
处理不同编码
中文或其他非英文字符需要特别注意文件编码:
# 读取UTF-8编码文件
with open(‘chinese.csv’, ‘r’, encoding=‘utf-8’) as file:
# 处理文件…
# 读取GBK编码文件(常见于中文Windows)
with open(‘chinese_gbk.csv’, ‘r’, encoding=‘gbk’) as file:
# 处理文件…
with open(‘chinese.csv’, ‘r’, encoding=‘utf-8’) as file:
# 处理文件…
# 读取GBK编码文件(常见于中文Windows)
with open(‘chinese_gbk.csv’, ‘r’, encoding=‘gbk’) as file:
# 处理文件…
常见错误: 遇到UnicodeDecodeError错误时,通常是文件编码设置错误!尝试使用’utf-8’、’gbk’或’latin-1’。