Python读取Excel提取字符串单元格并执行查询失败求助
问题描述
我上传了一份Excel文件,需要把文件中每个单元格的值提取为str对象,再针对每个单元格值执行查询操作,但目前代码无法正常运行。
我的代码
def read_agent_list(request): request.session.clear_expired() if request.is_ajax(): if request.method == "POST": userfile = request.FILES['userfile'].read() df = pd.read_excel(userfile,header=0) df=df.fillna('') df=df.astype(str) for index, row in df.iterrows(): agentcode=tuple(list(df['Agentcode']) ) agentlist=df.apply(lambda x: x.str.strip()) qry=getData(""" SELECT U.USER_ID AS AGENTCODE""".format() dff=getViaData(qry)
代码里的明显问题
- 语法错误:
qry=getData("""SELECT ...""".format()这里括号不匹配,format()缺右括号,SQL字符串也没闭合,直接会抛出语法异常。 - SQL语句无效:
SELECT U.USER_ID AS AGENTCODE没有指定表名,也没有关联Excel里的agentcode条件,等于没做有效查询;而且format()调用没有传入任何参数,完全是多余的。 - 循环逻辑浪费:在
iterrows循环里每次都重新提取整个DataFrame的Agentcode转元组,还重复对整个df做strip处理,完全没必要,应该在循环外统一处理数据。 - 参数未传入:查询语句根本没用到从Excel里提取的agentcode,等于没把Excel数据作为查询条件。
修正后的代码示例
def read_agent_list(request): request.session.clear_expired() # 合并条件判断,简化代码 if request.is_ajax() and request.method == "POST": userfile = request.FILES['userfile'].read() df = pd.read_excel(userfile, header=0) # 一次性完成空值填充、转字符串、去除首尾空格的处理 df = df.fillna('').astype(str).apply(lambda col: col.str.strip()) # 提取有效Agentcode(排除空字符串) valid_agents = df['Agentcode'][df['Agentcode'] != ''].tolist() if valid_agents: # 用批量查询减少数据库请求(推荐),这里以MySQL参数化写法为例 placeholders = ', '.join(['%s'] * len(valid_agents)) # 必须补充你的实际表名,替换掉`你的用户表` qry = f""" SELECT U.USER_ID AS AGENTCODE FROM 你的用户表 U WHERE U.USER_ID IN ({placeholders}) """ # 假设getViaData支持传入参数列表,把agentcode作为参数传入 dff = getViaData(qry, valid_agents) # 如果非要逐行查询(效率低,不推荐) # for agent in valid_agents: # qry = """ # SELECT U.USER_ID AS AGENTCODE # FROM 你的用户表 U # WHERE U.USER_ID = %s # """ # dff = getViaData(qry, (agent,))
关键注意事项
- 必须补充SQL语句中的实际表名,否则查询无法执行。
- 用参数化查询(不要直接拼接字符串),避免SQL注入风险。
- 根据你使用的数据库类型,调整参数占位符(比如PostgreSQL用
%s,SQL Server用?)。 - 确认
getViaData函数是否支持传入查询参数,若不支持需对应调整调用方式。
内容的提问来源于stack exchange,提问作者Ajitarth Gupta
相关产品推荐
相关产品推荐

