使用xlutils.copy.copy提示list index out of range

sj131******** 2021-01-22 11:21:41
1. 使用开发工具为Visual Studio 2019,Python版本为3.7,扩展包版本如下图

2. 我这边有一个需求,在使用xlrd2读取一个Excel表格,然后使用xlutils.copy.copy功能编辑这个Excel,实现数据更新后重新保存这个Excel表格,表格式xls格式,问题是我在第一遍执行这个方法的时候,运行完全正常可以得到我想要的结果,但是执行第二遍时候就提示报错“list index out of range”

3. 我尝试修改了bk为bk1,xlrd2我也重新import一遍as xlrd22,然后使用xlrd22.open_workbook试了下,但是我检查参数的时候发现跟bk对象无关,在编程软件里我注意到bk已经完整的获取到表格数据了,所以我想问题出在copy方法上,但是完全不知道该如何修改来达到我的目的,没有任何头绪,,,excel大小是2445KB,总共12个sheet,求大佬们指点。

附上两段方法代码:
#结单量透视
def secondStepII():
bk = xlrd2.open_workbook("数据\\" + fileName + "二级.xls", formatting_info = True) # 打开文件
wt = xlutils.copy.copy(bk) # 复制
sh=bk.sheet_by_index(1) #使用wlrd读取sheet2
nrows=sh.nrows #获取行数
ncols=sh.ncols #获取列数
sheet = wt.get_sheet(7) # wlwt读取sheet8
# 向单元格写入内容
#sheet.write(0,0, "Test")
erjiList = []
for i in range(1,nrows):
erjiList.append(sh.cell_value(i,10))
dict = {}
for key in erjiList:
dict[key] = dict.get(key, 0) + 1
aa = 2;
bb = 0;
allCount = 0;
sheet.write(1,0,"二级名称")
sheet.write(1,1,"计数")
for i in dict:
sheet.write(aa,bb,i)
bb += 1
sheet.write(aa,bb,dict[i])
allCount += dict[i]
bb -= 1
aa += 1
aa += 1
sheet.write(aa,bb,"总计")
bb += 1
sheet.write(aa,bb,allCount)
wt.save("数据\\" + fileName + "二级.xls") # 保存


#积压量透视
def thirdStepII():
bk = xlrd2.open_workbook("数据\\" + fileName + "二级.xls", formatting_info = True) # 打开文件
wt = xlutils.copy.copy(bk) # 复制 PS:到这里开始报错了list index out of range
sh=bk.sheet_by_index(2) #使用wlrd读取sheet3
nrows=sh.nrows #获取行数
ncols=sh.ncols #获取列数
sheet = wt.get_sheet(8) # wlwt读取sheet9
# 向单元格写入内容
#sheet.write(0,0, "Test")
erjiList = []
for i in range(1,nrows):
erjiList.append(sh.cell_value(i,10))
dict = {}
for key in erjiList:
dict[key] = dict.get(key, 0) + 1
aa = 2;
bb = 0;
allCount = 0;
sheet.write(1,0,"二级名称")
sheet.write(1,1,"计数")
for i in dict:
sheet.write(aa,bb,i)
bb += 1
sheet.write(aa,bb,dict[i])
allCount += dict[i]
bb -= 1
aa += 1
aa += 1
sheet.write(aa,bb,"总计")
bb += 1
sheet.write(aa,bb,allCount)
wt.save("数据\\" + fileName + "二级.xls") # 保存
...全文
333 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
虫无涯 2021-01-25
  • 打赏
  • 举报
回复
引用 6 楼 sj13155158153 的回复:
[quote=引用 4 楼 NoamaNelson 的回复:]是的,你使用了两个函数,每个函数都有对同一个excel打开-编辑-保存,这样就出问题了。 1、第一次打开-编辑-保存后,最好释放一下内存,比如bk.release_resources() 2、如果不释放,那么你第二个函数,这个时候再打开这个文件就会报错list index out of range,其实这个时候这个文件已经打开了,可以不用再打开 综上: 1、两个函数的话,第一个打开后释放,第二个函数再打开释放 2、把两个合再一起,其实就是一个函数,那么就是打开了一次而已,你运行完成后,解析器就自动释放内存了 本人博客:https://blog.csdn.net/NoamaNelson
额,我找不到在哪给分。[/quote] 你帖子的右小角,有个“结帖”的字样,进入后点击结帖给分就行了,哈哈哈
sj131******** 2021-01-25
  • 打赏
  • 举报
回复
引用 4 楼 NoamaNelson 的回复:
是的,你使用了两个函数,每个函数都有对同一个excel打开-编辑-保存,这样就出问题了。
1、第一次打开-编辑-保存后,最好释放一下内存,比如bk.release_resources()
2、如果不释放,那么你第二个函数,这个时候再打开这个文件就会报错list index out of range,其实这个时候这个文件已经打开了,可以不用再打开
综上:
1、两个函数的话,第一个打开后释放,第二个函数再打开释放
2、把两个合再一起,其实就是一个函数,那么就是打开了一次而已,你运行完成后,解析器就自动释放内存了

本人博客:https://blog.csdn.net/NoamaNelson


额,我找不到在哪给分。
sj131******** 2021-01-25
  • 打赏
  • 举报
回复
是这个情况,我之前找了下关于python如何释放对象的资料,但是可能搜索的方式不对,百度没找到,感谢指导。
sj131******** 2021-01-22
  • 打赏
  • 举报
回复
似乎也说不通,无论如何,这个excel表格本来就已经有十几个sheet了,那第一遍方法copy时候肯定就已经是10几个list了,不可能再执行一遍反而就不能保存十几个了吧,想不通。。。
sj131******** 2021-01-22
  • 打赏
  • 举报
回复
我测试到一种情况,我把两个方法执行的顺序调换了一下,先执行thirdStepII再执行secondStepII,这时候报错就出在secondStepII上了,报错内容依旧是out range,所以我在想是否是因为copy方法,只能存9个sheet页,超过九个就会出错?有大佬们知道要怎么做能不报错或者解决这个问题么。。。
虫无涯 2021-01-22
  • 打赏
  • 举报
回复
是的,你使用了两个函数,每个函数都有对同一个excel打开-编辑-保存,这样就出问题了。 1、第一次打开-编辑-保存后,最好释放一下内存,比如bk.release_resources() 2、如果不释放,那么你第二个函数,这个时候再打开这个文件就会报错list index out of range,其实这个时候这个文件已经打开了,可以不用再打开 综上: 1、两个函数的话,第一个打开后释放,第二个函数再打开释放 2、把两个合再一起,其实就是一个函数,那么就是打开了一次而已,你运行完成后,解析器就自动释放内存了 本人博客:https://blog.csdn.net/NoamaNelson
sj131******** 2021-01-22
  • 打赏
  • 举报
回复
目前问题已经解决了,我把两个方法合并到一块去了,copy过来后,直接修改所有的sheet,然后保存,没有出任何问题,猜测是copy完成以后,再次copy时,内容没有释放,还是保存在xlutils内存里,但是我查阅了官方API没找到哪里有清空的地方,不知道我的推测是不是正确的,有人来讨论么。。。初学Python 3天,碰到好多问题解决不了的,有大佬们知道哪里更活跃点吗。。。

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧