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

如何用Python将CSV导入SQLite3并去重(无需逐行遍历)

高效实现CSV增量导入SQLite3数据库

不用逐行遍历CSV或数据库也能搞定!核心思路是利用SQLite的临时表和批量SQL操作,把数据导入临时表后,再通过数据库层面的查询筛选出不存在的数据插入目标表,全程都是批量操作,效率拉满。

前提准备

首先你需要确定目标表有唯一标识(比如主键列,或者设置了唯一约束的列),这是判断数据是否已存在的关键。如果没有的话,也可以用所有列组合来判断,但效率会稍低一点。

完整代码示例

import pandas as pd
import sqlite3

# 1. 建立数据库连接
conn = sqlite3.connect('your_database.db')
cursor = conn.cursor()

# 2. 读取CSV文件到DataFrame
df = pd.read_csv('Data.csv')
target_table = 'your_table_name'  # 替换成你的目标表名

# 3. 将CSV数据导入临时表(批量导入,效率很高)
temp_table = 'temp_csv_import'
df.to_sql(temp_table, conn, index=False, if_exists='replace')

# 4. 构造增量插入的SQL语句
# 替换成你的唯一标识列(比如主键id)
unique_key = 'id'
# 获取CSV的所有列名,用逗号分隔
column_list = ', '.join(df.columns)

# 方法1:用NOT EXISTS筛选不存在的数据(灵活,不依赖唯一约束)
insert_query = f"""
INSERT INTO {target_table} ({column_list})
SELECT {column_list}
FROM {temp_table}
WHERE NOT EXISTS (
    SELECT 1
    FROM {target_table}
    WHERE {target_table}.{unique_key} = {temp_table}.{unique_key}
)
"""

# 方法2:用INSERT OR IGNORE(需目标表已设置唯一约束,更简洁)
# insert_query = f"""
# INSERT OR IGNORE INTO {target_table} ({column_list})
# SELECT {column_list} FROM {temp_table}
# """

# 5. 执行SQL并提交
cursor.execute(insert_query)
conn.commit()

# 6. 清理临时表(可选,SQLite会在连接关闭时自动删除临时表)
cursor.execute(f"DROP TABLE IF EXISTS {temp_table}")

# 7. 关闭连接
conn.close()

关键细节说明

  • 临时表的作用:df.to_sql批量导入临时表比逐行处理快得多,而且临时表只在当前数据库会话中存在,不会污染你的正式数据。
  • 两种插入方式的区别:
    • NOT EXISTS:不需要目标表有唯一约束,你可以自定义判断数据是否存在的逻辑(比如多列组合判断),灵活性更高。
    • INSERT OR IGNORE:需要目标表对唯一列设置了UNIQUE约束或主键,当插入重复数据时会自动忽略,代码更简洁,但如果有其他约束冲突也会一并忽略,需要根据你的业务场景选择。
  • 性能优势:所有筛选和插入操作都是在数据库层面完成的,比Python循环遍历每一行判断快几个量级,尤其适合大文件。

内容的提问来源于stack exchange,提问作者Ivan To

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:37:37