如何提前终止循环或移除追加字符串解决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确实存在多余元素,否则会漏掉正常数据。
额外代码优化建议
除了上述问题,你的代码还有几个可以优化的点:
- 重置
entries变量:当前代码里entries在处理新行时没有清空,会导致下一行内容累加在上一行后面,必须在for row in reader_obj:循环开头添加entries = ""。 - 优化字符串拼接:用
str.join()比反复拼接字符串高效得多,一行就能生成正确格式的字段值,还不用处理逗号问题:entries = ','.join([f"'{value}'" for value in row]) - 复用数据库连接:不要在循环里每次都新建连接,把连接放在循环外面,避免频繁建立连接的开销,记得最后提交事务并关闭连接:
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

