如何用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
相关产品推荐
相关产品推荐

