Python Excel/CSV 处理:openpyxl、pandas、csv 完整实战

小飞兽 Python 6 次阅读 2026-07-24

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