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

千余同结构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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:57:32