Flask从带表头的TextAreaField导入CSV到MySQL循环报错求助
问题分析与修复方案
你的代码存在几个关键问题导致循环部分报错,逐一说明并给出修复方案:
1. 字符串无法直接调用iterrows()方法
form.import_data.data获取到的是纯文本字符串,并非pandas的DataFrame对象,因此没有iterrows()方法,必须先将字符串解析为可迭代的CSV格式数据。
2. cursor.execute()不存在if_exists参数
if_exists='append'是pandasto_sql()方法的专属参数,MySQLdb游标execute()不支持该参数,属于参数误用。
3. CSV表头与数据的空格问题
你提供的CSV数据中,表头description前带有空格,直接解析后列名会变为 description(带前置空格),后续取row['description']会出现键不存在的错误。
修复后的代码(基于csv模块,无需依赖pandas)
修改后的views.py:
import csv from io import StringIO @admin.route('/import_csv/new_data', methods=['GET', 'POST']) @login_required def import_data(): mycursor = mydb.cursor() form = ImportServerForm() if form.validate_on_submit(): # 将文本内容转为可读取的IO对象 csv_io = StringIO(form.import_data.data) # 解析CSV,skipinitialspace忽略列名和数据前的空格 reader = csv.DictReader(csv_io, skipinitialspace=True) for row in reader: sql = """ INSERT INTO departements (name, description) VALUES (%s, %s) """ value = (row['name'], row['description']) mycursor.execute(sql, value) # 批量提交更高效,无需每次循环都执行commit mydb.commit()
可选方案(基于pandas解析)
如果习惯使用pandas,可简化为以下写法:
import pandas as pd from io import StringIO @admin.route('/import_csv/new_data', methods=['GET', 'POST']) @login_required def import_data(): form = ImportServerForm() if form.validate_on_submit(): csv_io = StringIO(form.import_data.data) df = pd.read_csv(csv_io, skipinitialspace=True) # 用to_sql自动处理插入,if_exists='append'实现追加 df.to_sql('departements', con=mydb, if_exists='append', index=False) mydb.commit()
内容的提问来源于stack exchange,提问作者Abdellah ALAOUI ISMAILI
相关产品推荐
相关产品推荐

