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

如何用Python将CSV文件夹批量转换为SQLite3数据库?

批量将CSV文件导入SQLite3数据库的问题

原本可以成功转换脚本所在文件夹中的单个CSV文件到SQLite3数据库,现在需要批量处理本地文件夹内的400-500个CSV文件,尝试用for循环遍历但遇到困难,以下是当前代码,求改进建议:

import os
import csv
import sqlite3 


connection = sqlite3.connect('Frame_Data.db')
c = connection.cursor()


for part_file in os.listdir('C:\Frame_DataBase\Frame_Data_TEST_DB'):
  if part_file.endswith(".csv"):
   with open(part_file) as file:
    records = 0
    for row in file:
      c.execute("""INSERT INTO    FrmTbl(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI) 
              VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"""
             ,row.split(","))
      connection.commit()
      records += 1 
      connection.close()

问题分析与修改方案

原代码存在几个关键问题,直接导致遍历失败或运行异常,以下是修正后的代码及说明:

修正后的代码

import os
import csv
import sqlite3

# 用原始字符串定义路径,避免转义字符问题
csv_folder = r'C:\Frame_DataBase\Frame_Data_TEST_DB'
db_name = 'Frame_Data.db'

# 数据库连接放在循环外,避免重复创建/提前关闭
connection = sqlite3.connect(db_name)
c = connection.cursor()

try:
    for filename in os.listdir(csv_folder):
        if filename.endswith(".csv"):
            # 拼接完整文件路径,解决脚本与CSV不在同一目录的问题
            full_path = os.path.join(csv_folder, filename)
            print(f"正在处理: {filename}")
            records = 0
            
            # 使用csv模块读取,处理字段含逗号的场景
            with open(full_path, 'r', newline='', encoding='utf-8') as file:
                csv_reader = csv.reader(file)
                # 若CSV包含表头,取消下面注释跳过表头
                # next(csv_reader)
                for row in csv_reader:
                    # 检查字段数量匹配,避免插入报错
                    if len(row) == 35:  # A到AI共35个字段
                        c.execute("""INSERT INTO FrmTbl(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI) 
                                    VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)""", row)
                        records += 1
                # 单个文件处理完后提交,提升效率
                connection.commit()
            print(f"{filename} 处理完成,插入 {records} 条记录")
finally:
    # 所有操作完成后统一关闭连接
    connection.close()
    print("数据库连接已关闭")

核心修改点

  • 路径处理:用os.path.join拼接完整文件路径,解决os.listdir仅返回文件名导致的文件找不到问题;用原始字符串定义路径,避免\被识别为转义字符。
  • 连接管理:将connection.close()移到finally块,确保所有文件处理完成后才关闭连接,避免第一次循环就切断后续操作的连接。
  • CSV读取:使用csv.reader代替手动split(","),能正确处理字段内包含逗号的情况,避免数据拆分错误。
  • 提交优化:单个文件处理完后再执行commit,比逐条插入提交效率更高。
  • 容错处理:增加字段数量检查,避免因CSV格式不一致导致插入报错;添加打印提示,方便追踪处理进度。

内容的提问来源于stack exchange,提问作者Jonathan Susman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:42:41