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
| 特性 | CSV | Excel |
|---|---|---|
| 文件大小 | 小 | 大 |
| 读写速度 | 快 | 慢 |
| 数据格式 | 仅文本 | 支持格式、公式 |
| 多工作表 | ||
| 跨平台 | ️ | |
| 推荐场景 | 大数据、纯数据 | 报告、多表 |
最佳实践
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 数据文件读写。
继续!