用xlrd读取表格时,报self._cell_types[rowx][colx],IndexError: list index out of range错误的处理一例

 

有一台得力的指纹刷卡机,导出的excel表格文件里的"刷卡记录"表中只有具体的刷卡时间记录,没有每人每月的刷卡总数统计,需要人工进行二次统计。

为此,我编写了一个python程序,可以将多个导出的表进行汇总,生成新的总表。代码如下:


import xlrd
import xlwt
from xlrd import open_workbook
import os,time

"""
统计某一行的消费记录总数
"""
def totalXfs(tb,theRow):
    n = 0
    for i in range(tb.ncols):
        cvStr=tb.cell(theRow,i).value
        if ('07:'in cvStr) or ('08:'in cvStr):
            n+=1
        if ('11:' in cvStr) or ('12:' in cvStr):
            n+=1
    # print (n)
    return n


allFileList=os.listdir('.\\')
fileList=[]
for i in allFileList:
    if i[-7:]=='汇总表.xls':
        fileList.append(i)
print(fileList)

wb2 = xlwt.Workbook(encoding='gbk')
tb2 = wb2.add_sheet('总表', cell_overwrite_ok=True)
tb2.write(1,1,'姓名')
col=1

for m in range(len(fileList)):
    wb=open_workbook(fileList[m])
    print ('正在处理:',fileList[m])
    tb2.write(1, col+1, fileList[m][:2]+'月份')
    tb=wb.sheet_by_name("刷卡记录")
    # print(tb.nrows,tb.ncols)

    for j in range(4,tb.nrows,2):
        if m==0:
            tb2.write(j//2,col,tb.cell(j,10).value)
        tb2.write(j//2,col+1,totalXfs(tb,j+1))
    col+=1

timeStr = time.strftime("%Y%m%d", time.localtime())
wb2.save('总表'+timeStr+'.xls')
print ('\n统计完毕。')

# END

在执行过程中大部分月份都很正常,但却有一个月份出现了错误,错误如下:

报self._cell_types[rowx][colx],IndexError: list index out of range错误,应该的遍历出问题了。搜索了网上的介绍,基本上都是说表格为空的原因。但是这个表格并不为空呀。琢磨了半天,发现这个表的最后一行(第288行)确实没有数据。会不会是因为这个原因呢?我想用tb.nrows读出的行数是288行,说明这288行是可以读取的。我尝试着读取288行的1~31列的单元格数据,结果就报相同错误。由此确定,这一行全部为空的话,是不能进行遍历的。于是修改了代码,不读取最后一行和上一行,问题解决。

修改的部分代码如下:


    try:
        for j in range(4,tb.nrows,2):
            if m==0:
                tb2.write(j//2,col,tb.cell(j,10).value)
            tb2.write(j//2,col+1,totalXfs(tb,j+1))
        col+=1
    except: #处理最后一行无消费记录的情形
        for j in range(4, tb.nrows-2, 2):
            if m == 0:
                tb2.write(j // 2, col, tb.cell(j, 10).value)
            tb2.write(j // 2, col + 1, totalXfs(tb, j + 1))
        tb2.write(tb.nrows // 2, col + 1, 0)
        col += 1

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Python中的数据库连接库(如MySQLdb、pymysql等)将循环中获取的数据保存到数据库中。首先,您需要在代码中导入相应的数据库连接库,并建立与数据库的连接。然后,在循环中获取到的数据处,将数据插入到数据库中。 以下是一个示代码: ```python import xlrd import pymysql # 建立与数据库的连接 conn = pymysql.connect(host='localhost', user='root', password='password', database='your_database') cursor = conn.cursor() # 打开Excel文件 workbook = xlrd.open_workbook("C:\\Users\\FangYingge\\Desktop\\FP510D206_高温.xls") sheet_cali = workbook.sheet_by_index(1) num = sheet_cali.nrows sheet_NW = workbook.sheet_by_index(0) num1 = sheet_NW.nrows for row in range(2, num): if sheet_cali.cell(rowx=row, colx=0).value != "": data1 = sheet_cali.row_values(row, 0, 6) # 将data1的数据插入数据库 cursor.execute("INSERT INTO your_table (column1, column2, column3, column4, column5, column6) VALUES (%s, %s, %s, %s, %s, %s)", data1) else: pass for row1 in range(2, num1): if sheet_NW.cell(rowx=row1, colx=9).value != "": print(row1, sheet_NW.cell(rowx=row1, colx=9).value, "通道") data3 = sheet_NW.row_values(row1, 15, 18) data2 = sheet_NW.row_values(row1, 2, 9) test_lx = data2[0] print(test_lx) if test_lx == 'IL': fre = 1 result = 2 state = 3 row1 -= 2 if test_lx == 'IL_Var': fre = 2 result = 3 state = 4 row1 -= 2 if test_lx == 'GD': fre = 3 result = 4 state = 5 row1 -= 2 # 将fre、result、state等数据插入数据库 cursor.execute("INSERT INTO your_table (column7, column8, column9) VALUES (%s, %s, %s)", (fre, result, state)) # 提交事务并关闭数据库连接 conn.commit() cursor.close() conn.close() ``` 请根据您的实际情况修改代码中的数据库连接参数、表名和列名,以及插入数据的SQL语句。注意,在插入数据,需要根据数据类型使用相应的占位符(如%s、%d等)。 这样,循环中获取的数据就会保存到数据库中了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值