CSV转SQLite时绑定参数数量不匹配问题求助
问题解决代码及解释
修正后的代码
seen = set() # 确保con和cur已完成SQLite连接与游标初始化 with open("E:/Forage/Walmart/task4/shipping_data_1.csv", 'r') as file: next(file) # 跳过CSV表头(如果文件包含表头) for row in file: row = row.strip() # 去除行首尾的空白和换行符 if row in seen: continue seen.add(row) # 取分割后的前2列数据,适配目标表的2列需求 data = row.split(',')[:2] cur.execute("INSERT INTO product VALUES(?, ?)", data) con.commit() # 循环结束后统一提交,提升操作效率 con.close()
错误原因解析
- 第一个参数数量错误:CSV每行分割后得到3个元素,而目标表仅需2列,直接传入会导致参数数量不匹配,需要舍弃第三列。
- 第二个参数数量错误:
row.split(',').pop()返回的是单个字符串(被移除的第三列内容),SQLite会把这个字符串拆成单个字符作为绑定参数,比如字符串长度为8就会生成8个值,和语句需要的2个完全不匹配。正确做法是保留分割后的列表(取前2个元素,或pop后剩下的列表)。 - 缩进逻辑错误:原代码中
seen.add(row)、cur.execute等语句在for循环外,导致只会处理最后一行数据,且去重逻辑完全失效。 - 去重逻辑漏洞:原始row包含换行符,直接存入
seen会让相同内容但换行符不同的行被误判为不重复,用strip()处理后可以避免这个问题。
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

