用 Python 处理 CSV / Excel 小任务

Python 是处理表格数据的利器,本文介绍处理 CSV 和 Excel 文件的常用方法。

1. CSV 处理

使用 csv 模块(标准库)

import csv

# 读取 CSV
with open("data.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

# 写入 CSV
data = [
    ["姓名", "年龄", "城市"],
    ["张三", "25", "北京"],
    ["李四", "30", "上海"],
]

with open("output.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data)

使用 pandas(推荐)

import pandas as pd

# 读取
df = pd.read_csv("data.csv")
print(df.head())

# 基本操作
df["年龄"].mean()           # 平均值
df[df["年龄"] > 25]       # 筛选
df.sort_values("年龄")       # 排序

2. Excel 处理

读取 Excel

import pandas as pd

# 读取 Excel 文件
df = pd.read_excel("data.xlsx")
df = pd.read_excel("data.xlsx", sheet_name="Sheet1")
df = pd.read_excel("data.xlsx", sheet_name=None)  # 读取所有 sheet

# 读取指定列
df = pd.read_excel("data.xlsx", usecols=[0, 1, 2])
df = pd.read_excel("data.xlsx", usecols="A,C:D")

写入 Excel

import pandas as pd

# 写入单个 sheet
df.to_excel("output.xlsx", index=False)

# 写入多个 sheet
with pd.ExcelWriter("output.xlsx") as writer:
    df1.to_excel(writer, sheet_name="Sheet1")
    df2.to_excel(writer, sheet_name="Sheet2")

# 指定列
df.to_excel("output.xlsx", columns=["姓名", "年龄"], index=False)

3. 常用 pandas 操作

数据筛选

import pandas as pd

df = pd.read_csv("data.csv")

# 按条件筛选
df[df["年龄"] > 25]
df[df["城市"].isin(["北京", "上海"])]

# 多条件
df[(df["年龄"] > 25) & (df["城市"] == "北京")]

数据转换

# 添加列
df["新列"] = df["列1"] + df["列2"]

# 修改列
df["年龄"] = df["年龄"] + 1

# 删除列
df.drop("列名", axis=1)

# 重命名列
df.rename(columns={"旧名": "新名"})

数据统计

df.describe()          # 统计摘要
df["列"].value_counts()  # 计数
df["列"].unique()    # 唯一值
df["列"].drop_duplicates()  # 去重

4. 处理大数据

分块读取

import pandas as pd

# 读取大文件
for chunk in pd.read_csv("big.csv", chunksize=10000):
    # 处理每块数据
    print(chunk.shape)

Excel 样式

import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill

# 创建带样式的 Excel
wb = Workbook()
ws = wb.active

# 写入数据
ws.append(["姓名", "年龄"])
ws.append(["张三", 25])

# 设置表头样式
header_font = Font(bold=True, color="FFFFFF")
header_fill = PatternFill(start_color="366091", end_color="366091", fill_type="solid")

for cell in ws[1]:
    cell.font = header_font
    cell.fill = header_fill

wb.save("styled.xlsx")

5. 实用示例

CSV 转 Excel

import pandas as pd

# 读取 CSV
df = pd.read_csv("data.csv")

# 写入 Excel
df.to_excel("data.xlsx", index=False)

Excel 多表合并

import pandas as pd

# 读取所有 sheet
all_sheets = pd.read_excel("data.xlsx", sheet_name=None)

# 合并
merged = pd.concat(all_sheets.values(), ignore_index=True)

# 保存
merged.to_excel("merged.xlsx", index=False)

CSV 去重

import pandas as pd

df = pd.read_csv("data.csv")

# 按列去重
df_unique = df.drop_duplicates(subset=["邮箱"])

df_unique.to_csv("unique.csv", index=False)

数据分组统计

import pandas as pd

df = pd.read_csv("sales.csv")

# 分组统计
grouped = df.groupby("产品").agg({
    "销售额": "sum",
    "数量": "mean"
}).reset_index()

grouped.to_excel("summary.xlsx", index=False)

6. 无 pandas 方案(轻量)

openpyxl(纯 Excel)

from openpyxl import load_workbook

# 读取
wb = load_workbook("data.xlsx")
ws = wb.active

for row in ws.iter_rows(values_only=True):
    print(row)

# 写入
from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.append(["姓名", "年龄"])
ws.append(["张三", 25])

wb.save("output.xlsx")

csvkit(万能转换)

# 安装
pip install csvkit

# CSV 转 Excel
csvexport data.xlsx | in2csv data.csv > data.xlsx

# Excel 转 CSV
in2csv data.xlsx > data.csv

# 查看
csvstat data.csv

7. 完整示例

数据处理脚本

#!/usr/bin/env python3
"""处理 Excel/CSV 数据的脚本"""

import pandas as pd
import argparse
from pathlib import Path


def process_file(input_file, output_file=None):
    """处理数据文件"""
    
    # 读取
    suffix = Path(input_file).suffix.lower()
    
    if suffix == ".csv":
        df = pd.read_csv(input_file)
    elif suffix in [".xlsx", ".xls"]:
        df = pd.read_excel(input_file)
    else:
        raise ValueError(f"不支持的文件格式: {suffix}")
    
    print(f"读取 {len(df)} 行数据")
    
    # 处理
    # ... 这里添加你的处理逻辑
    
    # 写入
    output_file = output_file or input_file
    output_suffix = Path(output_file).suffix.lower()
    
    if output_suffix == ".csv":
        df.to_csv(output_file, index=False)
    elif output_suffix in [".xlsx", ".xls"]:
        df.to_excel(output_file, index=False)
    
    print(f"已保存到 {output_file}")


if __name__ == "__main__":
    import sys
    if len(sys.argv) < 2:
        print("用法: python process.py <输入文件> [输出文件]")
        sys.exit(1)
    
    input_file = sys.argv[1]
    output_file = sys.argv[2] if len(sys.argv) > 2 else None
    process_file(input_file, output_file)

使用:

python process.py data.csv
python process.py data.xlsx output.csv
python process.py data.csv output.xlsx

快速对照表

方法 用途
pd.read_csv() 读取 CSV
pd.read_excel() 读取 Excel
df.to_csv() 写入 CSV
df.to_excel() 写入 Excel
df.head() 查看数据
df.shape 数据维度

Python 处理 CSV 和 Excel 简单高效,掌握这些方法能应对大部分表格数据处理需求。