Python Excel/CSV 处理:openpyxl、pandas、csv 完整实战
Introduction
日常工作中 Excel 和 CSV 是最常见的数据格式。本文对比三种处理方案:原生 csv(轻量)、openpyxl(读写 xlsx)、pandas(数据分析),并讲解数据清洗、格式设置、批量合并的实战技巧。
---
CSV 处理(内置 csv 模块)
import csv, os
# 读取 CSV
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f) # 返回字典列表
for row in reader:
print(row['name'], row['score'])
# 写入 CSV
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['name', 'score', 'grade'])
writer.writeheader()
writer.writerow({'name': '张三', 'score': 85, 'grade': 'B'})
writer.writerows([
{'name': '李四', 'score': 92, 'grade': 'A'},
{'name': '王五', 'score': 78, 'grade': 'C'}
])
# 大文件流式处理(内存友好)
with open('big.csv', 'r') as f:
reader = csv.reader(f)
next(reader) # 跳过表头
for row in reader:
process(row) # 逐行处理,不占内存
openpyxl(读写 Excel xlsx)
pip install openpyxl
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, Alignment, PatternFill
from openpyxl.utils import get_column_letter
# 创建工作簿
wb = Workbook()
ws = wb.active
ws.title = '成绩单'
# 写入数据
headers = ['姓名', '数学', '语文', '英语', '总分']
ws.append(headers)
students = [
['张三', 85, 90, 78],
['李四', 92, 88, 95],
['王五', 76, 82, 88],
]
for s in students:
ws.append(s + [sum(s[1:])]) # 加总分列
# 样式设置
header_fill = PatternFill('solid', fgColor='4472C4')
for cell in ws[1]:
cell.font = Font(bold=True, color='FFFFFF')
cell.fill = header_fill
cell.alignment = Alignment(horizontal='center')
# 设置列宽
ws.column_dimensions['A'].width = 12
for col in range(2, 5):
ws.column_dimensions[get_column_letter(col)].width = 10
# 保存
wb.save('grade_report.xlsx')
print('Excel 文件已生成')
读取和修改已有 Excel
wb = load_workbook('grade_report.xlsx')
ws = wb['成绩单']
# 读取数据
for row in ws.iter_rows(min_row=2, values_only=True):
name, math, chinese, english, total = row
print(f'{name}: 总分={total}')
# 找到并修改单元格
for row in ws.iter_rows(min_row=2):
if row[0].value == '张三':
row[4].value = 260 # 修改总分
break
# 插入行
ws.insert_rows(3) # 在第3行插入
ws.delete_rows(5) # 删除第5行
wb.save('grade_report.xlsx')
pandas 处理 Excel/CSV
import pandas as pd
# 读取
df = pd.read_csv('data.csv', encoding='utf-8')
df = pd.read_excel('sales.xlsx', sheet_name='2026年')
# 基本操作
df.head() # 前5行
df.info() # 数据类型和缺失值
df.describe() # 数值列统计
df.shape # 行列数
# 数据清洗
df.columns = df.columns.str.strip() # 列名去空格
df['价格'] = df['价格'].fillna(0) # 缺失值填充
df = df.drop_duplicates() # 删除重复行
df['日期'] = pd.to_datetime(df['日期']) # 转换日期类型
# 筛选和排序
df[df['销售额'] > 1000].sort_values('销售额', ascending=False)
# 分组统计
df.groupby('地区')['销售额'].agg(['sum', 'mean', 'count'])
# 导出
df.to_csv('output.csv', index=False, encoding='utf-8-sig')
df.to_excel('output.xlsx', index=False, sheet_name='数据')
批量合并多个 Excel
import pandas as pd, os, glob
all_data = []
for filepath in glob.glob('sales/*.xlsx'):
df = pd.read_excel(filepath, sheet_name='Sheet1')
df['来源文件'] = os.path.basename(filepath)
all_data.append(df)
combined = pd.concat(all_data, ignore_index=True)
combined.to_excel('combined_sales.xlsx', index=False)
print(f'合并完成:{len(combined)} 行')
常见问题
Q1: CSV 中文乱码怎么办?pd.read_csv('file.csv', encoding='utf-8-sig') 或 encoding='gbk'。
Q2: openpyxl 能读写 .xls 吗?不能,.xls 是老格式,需要用 xlrd 读取或用 pandas + openpyxl 引擎。
Q3: Excel 有公式怎么保留?load_workbook('file.xlsx', data_only=False) 保留公式,data_only=True 读取计算结果值。
延伸阅读
- pandas 数据透视表
- openpyxl 图表和绘图
- Python Excel 自动化报告生成
---
作者:小马 | 绍大技术网 shaoda.net