You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:15:03