1. CSV文件与Python数据处理基础
CSV文件作为一种轻量级数据交换格式,已经成为数据工作者日常处理中最常见的文件类型之一。它的全称是Comma-Separated Values(逗号分隔值),但实际上分隔符不仅限于逗号,也可以是制表符或其他字符。这种格式之所以广受欢迎,主要得益于以下几个特点:
- 结构简单:每行代表一条记录,字段间用分隔符隔开
- 兼容性强:几乎所有数据处理工具和编程语言都支持CSV格式
- 易读易写:可以用文本编辑器直接查看和编辑
- 体积小巧:相比Excel等二进制格式,CSV文件通常更小
在Python生态中,处理CSV主要有两种主流方式:内置的csv模块和第三方库pandas。对于简单的数据操作,csv模块完全够用;而pandas则提供了更强大的数据分析和处理能力。
提示:虽然CSV文件扩展名通常是.csv,但实际内容才是关键。有些系统会生成.tsv(制表符分隔)或.psv(竖线分隔)文件,本质上也是CSV的变体。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 家庭支出分析案例详解
2.1 数据准备与文件结构
让我们从一个实际的例子开始 - 家庭月度支出记录。假设我们有一个expenses.csv文件,内容如下:
code复制date,category,amount,note
2024-03-01,餐饮,45.5,午餐外卖
2024-03-02,交通,3.0,地铁费
2024-03-05,购物,299.0,买耳机
2024-03-10,餐饮,68.0,朋友聚餐
2024-03-15,娱乐,80.0,电影票
这个文件的结构非常典型:
- 第一行是表头,描述了各列的含义
- 每行代表一笔支出记录
- 各字段用逗号分隔
- 包含数值、日期和文本等多种数据类型
2.2 使用pandas进行数据分析
pandas是Python数据分析的事实标准库,它提供了DataFrame这种强大的数据结构,可以轻松处理表格数据。
2.2.1 基本读取与统计
python复制import pandas as pd
# 读取CSV文件
df = pd.read_csv("expenses.csv")
# 显示前几行
print(df.head())
# 基本统计信息
print(df.describe())
这段代码会输出:
- 数据的前几行内容
- 数值列(amount)的基本统计量(平均值、标准差、最小值、最大值等)
2.2.2 分类汇总分析
python复制# 按类别汇总支出
category_sum = df.groupby("category")["amount"].sum().sort_values(ascending=False)
print("各品类支出汇总:")
print(category_sum)
# 计算总支出
total = df["amount"].sum()
print(f"\n本月总支出:¥{total:.2f}")
输出结果:
code复制各品类支出汇总:
category
购物 299.0
餐饮 113.5
娱乐 80.0
交通 3.0
本月总支出:¥495.50
2.2.3 数据筛选与导出
python复制# 筛选餐饮类记录
dining = df[df["category"] == "餐饮"]
print("\n餐饮类记录:")
print(dining)
# 导出到新CSV文件
dining.to_csv("dining_expenses.csv", index=False)
2.3 使用csv模块处理数据
对于不想或不能使用pandas的情况,Python内置的csv模块也能很好地完成任务。
2.3.1 基本读取操作
python复制import csv
with open("expenses.csv", mode="r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(f"{row['date']}: {row['category']} ¥{row['amount']} ({row['note']})")
2.3.2 分类统计实现
python复制import csv
category_sum = {}
with open("expenses.csv", mode="r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
category = row["category"]
amount = float(row["amount"])
category_sum[category] = category_sum.get(category, 0) + amount
# 按金额降序输出
for category, total in sorted(category_sum.items(), key=lambda x: x[1], reverse=True):
print(f"{category}: ¥{total:.2f}")
3. 高级技巧与实战经验
3.1 编码问题处理
中文CSV文件最常见的坑就是编码问题。以下是几种常见情况及解决方案:
-
UTF-8编码(无BOM):
python复制with open("file.csv", encoding="utf-8") as f: reader = csv.reader(f) -
UTF-8 with BOM(常见于Windows系统):
python复制with open("file.csv", encoding="utf-8-sig") as f: reader = csv.reader(f) -
GBK/GB2312编码(旧版中文系统):
python复制with open("file.csv", encoding="gbk") as f: reader = csv.reader(f)
注意:如果不确定文件编码,可以先用chardet库检测:
code复制
