用 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 简单高效,掌握这些方法能应对大部分表格数据处理需求。