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") # 保存
uj5u.com熱心網友回復:
我測驗到一種情況,我把兩個方法執行的順序調換了一下,先執行thirdStepII再執行secondStepII,這時候報錯就出在secondStepII上了,報錯內容依舊是out range,所以我在想是否是因為copy方法,只能存9個sheet頁,超過九個就會出錯?有大佬們知道要怎么做能不報錯或者解決這個問題么。。。uj5u.com熱心網友回復:
似乎也說不通,無論如何,這個excel表格本來就已經有十幾個sheet了,那第一遍方法copy時候肯定就已經是10幾個list了,不可能再執行一遍反而就不能保存十幾個了吧,想不通。。。uj5u.com熱心網友回復:
目前問題已經解決了,我把兩個方法合并到一塊去了,copy過來后,直接修改所有的sheet,然后保存,沒有出任何問題,猜測是copy完成以后,再次copy時,內容沒有釋放,還是保存在xlutils記憶體里,但是我查閱了官方API沒找到哪里有清空的地方,不知道我的推測是不是正確的,有人來討論么。。。初學Python 3天,碰到好多問題解決不了的,有大佬們知道哪里更活躍點嗎。。。uj5u.com熱心網友回復:
是的,你使用了兩個函式,每個函式都有對同一個excel打開-編輯-保存,這樣就出問題了。1、第一次打開-編輯-保存后,最好釋放一下記憶體,比如bk.release_resources()
2、如果不釋放,那么你第二個函式,這個時候再打開這個檔案就會報錯list index out of range,其實這個時候這個檔案已經打開了,可以不用再打開
綜上:
1、兩個函式的話,第一個打開后釋放,第二個函式再打開釋放
2、把兩個合再一起,其實就是一個函式,那么就是打開了一次而已,你運行完成后,決議器就自動釋放記憶體了
本人博客:https://blog.csdn.net/NoamaNelson
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/251119.html
