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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:32:35