如何从CSV选取符合条件的数据插入SQLite对应分类数据表
遍历CSV分类插入SQLite实现方案
前置准备
不需要安装额外第三方包,直接使用Python内置的csv和sqlite3库即可,如果你习惯用Pandas做数据处理也可以用第二种方案。
提前完成两项配置:
- 在SQLite中创建好对应消费类别的表,比如
food、transport、entertainment等,表结构和CSV的字段一一对应,示例表结构:
CREATE TABLE IF NOT EXISTS food ( id INTEGER PRIMARY KEY AUTOINCREMENT, trade_time TEXT NOT NULL, amount REAL NOT NULL, merchant TEXT, remark TEXT );
- 确认你的CSV里有明确的
category字段存储已经分好的类别值,和你建的表名可以对应上。
方案1:内置库实现(轻量适合小数据量)
import csv import sqlite3 # 1. 配置映射关系:类别值 -> 对应的SQLite表名,可根据自己的分类扩充 CATEGORY_TABLE_MAP = { "餐饮": "food", "交通": "transport", "娱乐": "entertainment", "购物": "shopping" } # 2. 连接SQLite数据库 conn = sqlite3.connect("personal_expense.db") cur = conn.cursor() # 3. 遍历CSV逐行处理 with open("your_expense.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) next(reader) # 跳过CSV表头,如果没有表头可以删掉这行 for row in reader: # 这里假设CSV的第5列是category字段,你可以根据实际字段顺序调整索引 category = row[4] # 只处理已经定义映射关系的类别,未匹配的类别直接跳过 if category not in CATEGORY_TABLE_MAP: continue table_name = CATEGORY_TABLE_MAP[category] # 参数化插入,避免SQL注入和字符串转义问题 # 字段数量和顺序要和你CSV行的内容对应,也可以明确写字段名避免错位 try: cur.execute( f"INSERT INTO {table_name} (trade_time, amount, merchant, remark) VALUES (?, ?, ?, ?)", (row[0], float(row[1]), row[2], row[3]) ) except Exception as e: print(f"插入行失败 {row}: {str(e)}") continue # 4. 提交更改并关闭连接 conn.commit() cur.close() conn.close()
方案2:Pandas实现(适合大数据量)
如果你的CSV数据量超过1万行,用Pandas分组插入效率更高:
import pandas as pd import sqlite3 CATEGORY_TABLE_MAP = { "餐饮": "food", "交通": "transport", "娱乐": "entertainment", "购物": "shopping" } conn = sqlite3.connect("personal_expense.db") # 读取CSV df = pd.read_csv("your_expense.csv", encoding="utf-8") # 按类别字段分组 for category, group_df in df.groupby("category"): if category not in CATEGORY_TABLE_MAP: continue table_name = CATEGORY_TABLE_MAP[category] # 写入SQLite,if_exists设为append就是追加写入,不会覆盖原有数据 group_df.drop(columns=["category"]).to_sql( name=table_name, con=conn, if_exists="append", index=False ) conn.close()
注意事项
- 插入SQLite时用参数化查询,不要直接拼接SQL字符串,避免特殊字符(比如商户名里的单引号)导致SQL语法错误
- 可以根据需求增加数据校验逻辑,比如金额为负、时间格式错误的行直接跳过或者记录到错误日志里
- 首次运行可以先注释掉
conn.commit(),运行看报错日志有没有问题,确认无误再提交写入
内容的提问来源于stack exchange,提问作者Robin Baggott la Velle
相关产品推荐
相关产品推荐

