2012-12-06 142 views
0

我正在製作一個Python腳本,它使用xlrd庫來解析Excel文件。 我想要做的是計算不同的列if單元格包含一定的值。否則,跳過這些值。然後將輸出存儲在字典中。 這裏就是我試圖做的:使用python跳過excel行

import xlrd 


workbook = xlrd.open_workbook('filter_data.xlsx') 
worksheet = workbook.sheet_by_name('filter_data') 

num_rows = worksheet.nrows -1 
num_cells = worksheet.ncols - 1 

first_col = 0 
scnd_col = 1 
third_col = 2 

# Read Data into double level dictionary 
celldict = dict() 
for curr_row in range(num_rows) : 

    cell0_val = int(worksheet.cell_value(curr_row+1,first_col)) 
    cell1_val = worksheet.cell_value(curr_row,scnd_col) 
    cell2_val = worksheet.cell_value(curr_row,third_col) 

    if cell1_val[:3] == 'BL1' : 
     if cell2_val=='toSkip' : 
     continue 
    elif cell1_val[:3] == 'OUT' : 
     if cell2_val == 'toSkip' : 
     continue 
    if not cell0_val in celldict : 
     celldict[cell0_val] = dict() 
# if the entry isn't in the second level dictionary then add it, with count 1 
    if not cell1_val in celldict[cell0_val] : 
     celldict[cell0_val][cell1_val] = 1 
     # Otherwise increase the count 
    else : 
     celldict[cell0_val][cell1_val] += 1 

所以在這裏你可以看到,我指望的「cell1_val」值,每個「cell0_val」的數量。但是我想在執行總和並將其存儲在字典中之前跳過那些在相鄰列的單元格中具有「toSkip」的值。 我在這裏做錯了事,我覺得解決方案更簡單。 任何幫助,將不勝感激。謝謝。

這裏是我的薄片的一個例子:

cell0 cell1 cell2 
12 BL1 toSkip 
12 BL1 doNotSkip 
12 OUT3 doNotSkip 
12 OUT3 toSkip 
13 BL1 doNotSkip 
13 BL1 toSkip 
13 OUT3 doNotSkip 
+0

如果有幫助,可能要查看[DataNitro](https://datanitro.com/)。 – jdotjdot

+0

如果您提供了一些示例數據,以便我們可以更好地查看您正在處理的工作表,那麼這將有所幫助。當我編寫你腦中迭代的數據時,很難提供幫助,尤其是當我不清楚「toSkip」是在你跳過的單元格還是在它旁邊的單元格中。 – jdotjdot

+0

@jdotjdot我編輯了我的問題。謝謝。 – salamey

回答

1

使用collections.defaultdictcollections.Counter爲您的嵌套字典。

這是在行動:

>>> from collections import defaultdict, Counter 
>>> d = defaultdict(Counter) 
>>> d['red']['blue'] += 1 
>>> d['green']['brown'] += 1 
>>> d['red']['blue'] += 1 
>>> pprint.pprint(d) 
{'green': Counter({'brown': 1}), 
'red': Counter({'blue': 2})} 

這被集成到你的代碼:

from collections import defaultdict, Counter 
import xlrd 

workbook = xlrd.open_workbook('filter_data.xlsx') 
worksheet = workbook.sheet_by_name('filter_data') 

first_col = 0 
scnd_col = 1 
third_col = 2 

celldict = defaultdict(Counter) 
for curr_row in range(1, worksheet.nrows): # start at 1 skips header row 

    cell0_val = int(worksheet.cell_value(curr_row, first_col)) 
    cell1_val = worksheet.cell_value(curr_row, scnd_col) 
    cell2_val = worksheet.cell_value(curr_row, third_col) 

    if cell2_val == 'toSkip' and cell1_val[:3] in ('BL1', 'OUT'): 
     continue 

    celldict[cell0_val][cell1_val] += 1 

我還結合你如果-statments和改變curr_row計算更簡單。

+0

謝謝,這簡化了很多事情,並做我想要的。 – salamey

0

看樣子你想跳過當前行每當cell2_val等於'toSkip',因此,如果您計算cell2_val後直接添加if cell2_val=='toSkip' : continue將簡化代碼。

而且,當你有

# if the entry isn't in the second level dictionary then add it, with count 1 
if not cell1_val in celldict[cell0_val] : 
    celldict[cell0_val][cell1_val] = 1 
    # Otherwise increase the count 
else : 
    celldict[cell0_val][cell1_val] += 1 

通常的成語更像

celldict[cell0_val][cell1_val] = celldict[cell0_val].get(cell1_val, 0) + 1 

也就是說,使用默認值0,這樣,如果關鍵cell1_val尚未在celldict[cell0_val]然後, get()將返回0.

+0

謝謝,這也適用! – salamey