Skip to content

CSV 与 Excel 文件处理

数据分析的常用格式 —— 表格数据的读写


CSV 文件操作

使用 csv 模块

python
import csv

# 写入 CSV
data = [
    ['Name', 'Age', 'Income'],
    ['Alice', 25, 50000],
    ['Bob', 30, 75000],
    ['Carol', 35, 85000]
]

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

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

使用 Pandas(推荐)

python
import pandas as pd

# 读取 CSV
df = pd.read_csv('survey.csv')
print(df.head())

# 写入 CSV
df.to_csv('output.csv', index=False, encoding='utf-8-sig')  # utf-8-sig 避免 Excel 乱码

# 常用参数
df = pd.read_csv(
    'data.csv',
    sep=',',              # 分隔符
    header=0,             # 第一行是列名
    names=['col1', 'col2'],  # 自定义列名
    usecols=[0, 1, 3],   # 只读某些列
    dtype={'age': int},   # 指定数据类型
    na_values=['NA', '']  # 缺失值标记
)

Excel 文件操作

安装依赖

bash
pip install openpyxl  # 用于 .xlsx
pip install xlrd      # 用于旧版 .xls

读取 Excel

python
import pandas as pd

# 读取 Excel
df = pd.read_excel('survey.xlsx', sheet_name='Sheet1')

# 读取多个工作表
excel_file = pd.ExcelFile('survey.xlsx')
print(excel_file.sheet_names)  # 查看所有工作表

df1 = pd.read_excel(excel_file, sheet_name='2023')
df2 = pd.read_excel(excel_file, sheet_name='2024')

# 读取所有工作表到字典
all_sheets = pd.read_excel('survey.xlsx', sheet_name=None)

写入 Excel

python
# 单个工作表
df.to_excel('output.xlsx', sheet_name='Results', index=False)

# 多个工作表
with pd.ExcelWriter('report.xlsx') as writer:
    df1.to_excel(writer, sheet_name='2023', index=False)
    df2.to_excel(writer, sheet_name='2024', index=False)

实战案例

案例 1:合并多个 CSV 文件

python
import pandas as pd
from pathlib import Path

# 读取文件夹中所有 CSV
data_dir = Path('surveys')
all_data = []

for csv_file in data_dir.glob('*.csv'):
    df = pd.read_csv(csv_file)
    df['source_file'] = csv_file.name  # 添加来源标识
    all_data.append(df)

# 合并
combined_df = pd.concat(all_data, ignore_index=True)
combined_df.to_csv('combined_survey.csv', index=False)

print(f"合并了 {len(all_data)} 个文件,共 {len(combined_df)} 行")

案例 2:Excel 报告生成

python
import pandas as pd

# 准备数据
summary = pd.DataFrame({
    'Category': ['Male', 'Female', 'Total'],
    'Count': [450, 550, 1000],
    'Avg_Income': [75000, 70000, 72500]
})

details = pd.DataFrame({
    'ID': range(1, 11),
    'Age': [25, 30, 35, 28, 32, 40, 27, 33, 38, 29],
    'Income': [50000, 75000, 85000, 60000, 70000, 90000, 55000, 80000, 95000, 65000]
})

# 写入 Excel(多个工作表)
with pd.ExcelWriter('analysis_report.xlsx') as writer:
    summary.to_excel(writer, sheet_name='Summary', index=False)
    details.to_excel(writer, sheet_name='Details', index=False)

print("报告已生成:analysis_report.xlsx")

案例 3:数据清洗流水线

python
import pandas as pd

# 读取
df = pd.read_csv('raw_survey.csv')

# 清洗
df_clean = (df
    .dropna(subset=['age', 'income'])  # 删除缺失
    .query('18 <= age <= 100')          # 筛选年龄
    .query('income > 0')                # 筛选收入
    .assign(income_log=lambda x: np.log(x['income']))  # 新列
)

# 保存
df_clean.to_csv('clean_survey.csv', index=False)

print(f"原始数据: {len(df)} 行")
print(f"清洗后: {len(df_clean)} 行")

CSV vs Excel

特性CSVExcel
文件大小
读写速度
数据格式仅文本支持格式、公式
多工作表
跨平台
推荐场景大数据、纯数据报告、多表

最佳实践

1. CSV 编码问题

python
# Windows Excel 读取中文
df.to_csv('output.csv', encoding='utf-8-sig', index=False)

# Mac/Linux
df.to_csv('output.csv', encoding='utf-8', index=False)

2. 大文件处理

python
# 分块读取大 CSV
chunk_size = 10000
chunks = []

for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
    # 处理每一块
    processed = chunk[chunk['age'] > 18]
    chunks.append(processed)

result = pd.concat(chunks, ignore_index=True)

3. 数据类型优化

python
# 节省内存
df = pd.read_csv('data.csv', dtype={
    'id': 'int32',
    'age': 'int8',
    'income': 'float32',
    'gender': 'category'
})

练习题

python
# 练习 1:CSV 数据分析
# 读取 students.csv,包含: name, age, major, gpa
# 任务:
# 1. 筛选 GPA >= 3.5 的学生
# 2. 按专业分组统计平均 GPA
# 3. 保存结果到 high_performers.csv

# 练习 2:Excel 多表合并
# 读取 survey_2023.xlsx 和 survey_2024.xlsx
# 合并两年数据,添加 'year' 列
# 保存到新 Excel 的 'Combined' 工作表

下一步

下一节学习 Stata 数据文件读写

继续!

基于 MIT 许可证发布。内容版权归作者所有。