使用Pandas导入时序TXT数据到MySQL时出现KeyError:7问题求助
排查Python导入时序数据到MySQL时的KeyError:7问题
首先,KeyError:7的直接原因是你当前读取的CSV文件没有第8列(pandas的列索引从0开始,索引7对应第8个字段),代码里尝试访问data[7].values但该列不存在,所以触发了这个错误。下面一步步分析可能的诱因和解决办法:
一、先定位问题文件
首先要确定到底是哪个文件的列数不符合预期,在循环中添加打印语句,输出当前处理的文件名和列数:
for i in list_of_files: print(f"正在处理文件: {i}") data = pd.read_csv(i, header=None) print(f"文件{i}的列数: {len(data.columns)}") # 后续代码...
运行后你就能看到哪个文件的列数不是8列,这就是触发错误的源头。
二、常见诱因及修复方案
1. 部分TXT文件字段数不一致
你的一批文件里,可能有的文件因为生成问题,只有7列(或更少),导致pandas读取后没有索引为7的列。
- 修复方式:跳过列数不符合要求的文件,或者根据业务逻辑补充缺失列:
for i in list_of_files: print(f"正在处理文件: {i}") data = pd.read_csv(i, header=None) # 检查列数是否符合预期(假设需要8列) if len(data.columns) != 8: print(f"警告:文件{i}列数异常({len(data.columns)}列),已跳过") continue # 后续插入逻辑
2. CSV读取参数错误
可能你的TXT文件里的分隔符不是严格的逗号,或者存在带引号的字段、空行,导致pandas识别列数错误。
- 修复方式:明确指定分隔符,并开启错误行警告:
# 指定分隔符为逗号,同时对错误行发出警告(pandas 1.3.0+支持) data = pd.read_csv(i, header=None, sep=',', on_bad_lines='warn')
3. 代码中SQL语句与参数不匹配的隐藏问题
除了KeyError,你的代码还有两个潜在的严重问题:
- SQL占位符错误:你在SQL里写了
'%s',这会把占位符当成字符串字面量,mysql.connector会自动处理数据类型,不需要手动加单引号,否则会导致SQL语法错误。 - 批量插入逻辑错误:
data[0].values是整列的数组,直接传给cur.execute()会导致参数不匹配,因为execute()是用来插入单行的,批量插入应该用executemany()。
修复后的插入代码示例:
# 将DataFrame转换为二维列表(每一行是一个记录) records = data.values.tolist() # 批量插入所有行 cur.executemany(""" INSERT INTO table1 (DATETIME, NODE, COND, COUNTER1, C1753359343, COUNTER2, C1753359344) VALUES ( %s,%s,%s,%s,%s,%s,%s ) """, records) # 别忘了提交事务,否则数据不会写入数据库 cnx.commit()
三、额外建议
- 处理完所有文件后,记得关闭游标和数据库连接:
cur.close() cnx.close()
- 可以给
glob.glob指定更精确的路径,避免匹配到无关的TXT文件:比如glob.glob('/path/to/desktop/file_*.txt')(替换成你的桌面文件夹路径)。
内容的提问来源于stack exchange,提问作者canarcho
相关产品推荐
相关产品推荐

