千余同结构CSV文件导入SQLite合并时遇语法错误求助
解决SQLite合并CSV表时的语法错误问题
问题场景
有1000+结构一致的SECONDARY CSV文件(压缩后400KB-3531KB),文件名作为关联MAIN CSV的主键。需对这些文件执行分组操作并结合MAIN表查询,通过Python+pandas+SQLite导入数据时,单个CSV可成功生成对应表,但合并为master表时触发以下错误:
OperationalError: near "-": syntax error
错误原因
代码仅对master表名做了特殊字符清洗,但单个CSV对应的表名直接使用文件名(含-等SQLite非法字符),导致SQL执行时解析带特殊字符的表名失败。
解决方案
1. 修复表名清洗逻辑
给每个CSV对应的表名也做特殊字符过滤,确保表名符合SQLite命名规则:
修改循环内的表名生成代码:
# 原代码 table_name = os.path.splitext(csv_file)[0] # 修改后 table_name = re.sub(r'\W+', '', os.path.splitext(csv_file)[0])
这样所有表名都会移除非单词字符(如-、空格等),避免SQL语法错误。
2. 优化合并逻辑(可选,更高效)
原代码先创建1000+中间表再合并,效率较低。可直接将所有CSV数据追加到同一个master表,无需创建中间表:
import pandas as pd import sqlite3 import os import re csv_directory = r"path" conn = sqlite3.connect("db.db") master_table = "master_table" master_table = re.sub(r'\W+', '', master_table) csv_files = [file for file in os.listdir(csv_directory) if file.endswith(".csv")] # 处理第一个CSV,创建master表 first_csv = csv_files[0] csv_path = os.path.join(csv_directory, first_csv) df = pd.read_csv(csv_path) df['filename'] = os.path.basename(first_csv) df.to_sql(master_table, conn, index=False, if_exists='replace') # 循环处理剩余CSV,追加到master表 for csv_file in csv_files[1:]: csv_path = os.path.join(csv_directory, csv_file) df = pd.read_csv(csv_path) df['filename'] = os.path.basename(csv_file) df.to_sql(master_table, conn, index=False, if_exists='append') conn.commit() conn.close()
这种方式减少了大量中间表的创建,内存和磁盘占用更低,执行速度更快。
额外注意事项
- 如果需要保留原始文件名作为关联键,
filename列存储的是原始文件名(含特殊字符),不影响,因为这是数据列而非表名。 - SQLite表名允许的字符包括字母、数字、下划线,避免使用空格、连字符、特殊符号,否则需用双引号包裹表名(需设置
PRAGMA quote_style=1;),但优先清洗表名更稳妥。
内容的提问来源于stack exchange,提问作者AmeliaAcu
相关产品推荐
相关产品推荐

