2016-03-08 68 views
0
import xlrd 
fileWorkspace = '/Users/Bob/Desktop/' 

wb1 = xlrd.open_workbook(fileWorkspace + 'Book1.xlsx') 
sh1 = wb1.sheet_by_index(0) 

colA,colB,colC,colD = [],[],[],[] 
for a in range(3,sh1.nrows): 
    colA.append(int(sh1.cell(a,0).value)) 
    colB.append(float(sh1.cell(a,1).value)) 
    colC.append(str(sh1.cell(a,2).value)) 
    colD.append(str(sh1.cell(a,3).value)) 
print(colA) 
print(colB) # Need to add 10 if indicated 
print(colC) 
print(colD) # Adding 10 is indicated by "add10" 
print('\n') 

update_colB_values = [] 
for i in range(3,sh1.nrows):  
    if sh1.cell(i,3).value == "add10": 
     add = (sh1.cell(i,1).value) + 10 
     update_colB_values.append(add) 
print(update_colB_values) 

我正在爲其旁邊具有「add10」的值獲取所有新值。我如何創建一個數組來替換那些新增加的「add10」值的數組?用新數字替換列表中的舊數字並創建新數組

最初從Excel文件COLB打印拉:

[32.0, 5.0, 12.0, 1.0, 87.0, 9.0] # This is fine 

更新後,我希望有,因爲10.0已添加到他們更新列表清單。因此,新的COLB應該是:

[42.0, 15.0, 12.0, 1.0, 87.0, 19.0] # new_colB. This is what I want after the update. 

整個輸出截至目前:

[0, 1, 2, 3, 4, 5] 
[32.0, 5.0, 12.0, 1.0, 87.0, 9.0] 
['', '', '', '', '', ''] 
['add10', 'add10', '', '', '', 'add10'] 


[42.0, 15.0, 19.0] 

Excel文件圖像: Excel File

回答

0

現在你只追加值更新已更改的列表。相反,您想要追加所有值,同時更新需要添加的值。下面是使用現有的列與列表理解的一種形式:

colB = [32.0, 5.0, 12.0, 1.0, 87.0, 9.0] 
colD = ['add10', 'add10', '', '', '', 'add10'] 

update_colB_values = [B + 10 if D == 'add10' else B for B, D in zip(colB, colD)] 
# [42.0, 15.0, 12.0, 1.0, 87.0, 19.0] 

你應該能夠取代你的實例化和for循環這條線。

應該注意的是,內置的zip是一個非常有用的功能,您可以在以前的代碼中使用它。例如,它的基本行爲是「轉移」2D列表。

matrix = [['a1', 'a2', 'a3'], 
      ['b1', 'b2', 'b3'], 
      ['c1', 'c2', 'c3']] 

for row in zip(*matrix): 
    print(list(row)) 

# ['a1', 'b1', 'c1'] 
# ['a2', 'b2', 'c2'] 
# ['a3', 'b3', 'c3'] 

功能zip需要的位置參數的任意數量的和所有的ith元件匹配在一起。只要其中一行耗盡,迭代結束,因此如果您想要填充,zip_longest(Python 3)或izip_longest(Python 2)itertools會很有用。

要使用您現有的代碼執行此操作,您可以添加else語句,以便包含不需要添加到中的元素。

update_colB_values = [] 
for i in range(3,sh1.nrows):  
    if sh1.cell(i,3).value == "add10": 
     add = (sh1.cell(i,1).value) + 10 
     update_colB_values.append(add) 
    else:         # add 
     value = sh1.cell(i,1).value   # these 
     update_colB_values.append(value)  # lines 
+0

無效的語法是我得到 – Bob

+0

@Bob更新,可測試的例子 –

+0

這一行代碼做了工作的那部分的錯誤,但有沒有辦法做到這一點沒有拉鍊,因爲我從來沒用過它,我只想堅持for循環和if語句。 – Bob

相關問題