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

如何提前终止循环或移除追加字符串解决entries重复存储问题

问题描述

我写了一段从CSV读取字符串并导入MySQL的代码:

entries = ""
counter = 1

with open('dataset.csv') as file_obj:
    heading = next(file_obj)
    reader_obj = csv.reader(file_obj)
    for row in reader_obj:
        #print(row)
        for value in row:
            #print(value)
            entries = entries + "'" + value + "'" + ","
            #print(entries)
        try:
            connection = mysql.connector.connect(host='localhost', database='test', user='root', password='********')

            sql_insert_stmt = "insert into diseases values(" + entries + " '' );"

            print(sql_insert_stmt)
            
            cursor = connection.cursor()
            result = cursor.execute(sql_insert_stmt)
            print(f"inserted {counter} entry")
            counter += counter

        except mysql.connector.Error as error:
            print("Failed to add value in MySQL: {}".format(error))

发现内层循环:

for value in row:
    #print(value)
    entries = entries + "'" + value + "'" + ","
    #print(entries)

多执行了一次,导致entries重复存储了同一行的所有值。想知道怎么让循环提前终止一次,或者移除变量最后追加的字符串?

解决方法

方法1:移除最后追加的多余字符串

不用修改循环逻辑,直接在循环结束后去掉entries末尾的逗号即可:

for value in row:
    entries = entries + "'" + value + "'" + ","
# 剔除最后一个多余的逗号
entries = entries.rstrip(',')

处理后entries的格式就正常了,后续拼接SQL语句时也不用额外加''凑数。

方法2:让循环提前终止一次

如果确认row里确实多了一个无效元素,可以只遍历前N-1个元素,再单独处理最后一个:

# 遍历除最后一个元素外的所有值
for value in row[:-1]:
    entries = entries + "'" + value + "'" + ","
# 单独处理最后一个元素,不加逗号
entries += f"'{row[-1]}'"

注意:这种方法要确保row确实存在多余元素,否则会漏掉正常数据。

额外代码优化建议

除了上述问题,你的代码还有几个可以优化的点:

  1. 重置entries变量:当前代码里entries在处理新行时没有清空,会导致下一行内容累加在上一行后面,必须在for row in reader_obj:循环开头添加entries = ""。
  2. 优化字符串拼接:用str.join()比反复拼接字符串高效得多,一行就能生成正确格式的字段值,还不用处理逗号问题:
    entries = ','.join([f"'{value}'" for value in row])
    
  3. 复用数据库连接:不要在循环里每次都新建连接,把连接放在循环外面,避免频繁建立连接的开销,记得最后提交事务并关闭连接:

try:
connection = mysql.connector.connect(host='localhost', database='test', user='root', password='********')
cursor = connection.cursor()
with open('dataset.csv') as file_obj:
heading = next(file_obj)
reader_obj = csv.reader(file_obj)
counter = 1
for row in reader_obj:
entries = ','.join([f"'{value}'" for value in row])
sql_insert_stmt = f"insert into diseases values({entries});"
cursor.execute(sql_insert_stmt)
print(f"inserted {counter} entry")
counter += 1
connection.commit()
except mysql.connector.Error as error:
print("Failed to add value in MySQL: {}".format(error))
finally:
if connection.is_connected():
cursor.close()
connection.close()

4. **修正计数逻辑**:当前`counter += counter`会让计数变成1→2→4→8...,应该改成`counter += 1`才是正常的递增。
5. **避免SQL注入**:直接拼接字符串生成SQL有注入风险,建议用参数化查询:
```python
sql_insert_stmt = "insert into diseases values(" + ','.join(['%s']*len(row)) + ");"
cursor.execute(sql_insert_stmt, row)

既安全又不用手动处理引号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:30:45