2016-10-28 59 views
0

我想要做什麼: 跳過A1:A6,跳過B1:B6並將其餘保存到csv。等同地,我想將A7: B+ws.max_row保存爲csv。在xlsx中是否有更多pythonic方式跳過行?

我的方法:

for sheet_name in wb.get_sheet_names(): 
    sheet = wb.get_sheet_by_name(sheet_name) 

    col1 = [] 
    cnt = 1 
    for i in sheet['A']: 
     if cnt <= 6: 
      cnt += 1 
      continue 
     col1.append(i.value) 

    col2 = [] 
    cnt = 1 
    for i in sheet['B']: 
     if cnt <= 6: 
      cnt += 1 
      continue 
     col2.append(i.value) 

    data = zip(col1, col2) 

    with open(str(sheet_name)+'.csv','wb') as out: 
     csv_out=csv.writer(out) 
     for row in data: 
      csv_out.writerow(row) 

我不喜歡什麼我的方法:cnt和手動選擇,然後選擇B.(我想跳過完全相同的行數爲A和B)

我的問題: 在xlsx中是否有更多pythonic方式跳過行?

+0

難道你不能'zip(sheet ['A'],sheet [ 'B'])'或者'可能'在表單['A:B']中行'(我不熟悉這個包,所以這只是猜測我的部分) –

+0

我試過'zip(sheet ['A7 ':'the_max_row'],sheet ['B7':'the_max_row'])'但它只返回單元的元組,但它不能返回單元的值。 –

+0

如果你可以得到一個元組的元組,你不能使用每個元組中的單元嗎? –

回答

2

openpyxl 2.4引入了工作表iter_cols()方法(特別注意:它不適用於只讀工作表),這樣就可以簡單地這樣做

cols = {1:[], 2:[]} 

for idx, col in enumerate(ws.iter_cols(min_col=1, max_col=2, min_row=6), start=1): 
    cols[idx] = [cell.value for cell in col] 

注意,請不要使用wb.get_sheet_names()wb.get_sheet_by_name()爲這些方法已被棄用。改爲使用wb.sheetnameswb[sheetname]

3

對我來說,最簡單的做法是從第7行開始,逐行迭代,然後將每行寫入CSV,然後不使用臨時副本。我不太瞭解OpenPyXL。隨着xlrd,你的整個代碼示例(你在你的問題包含的所有內容)將被表示爲

for sheet_name in wb.sheet_names(): 
    sheet = wb.sheet_by_name(sheet_name) 

    with open(sheet_name + '.csv', 'wb') as out: 
     csv_out = csv.writer(out) 
     for rx in range(6, sheet.nrows): 
      csv_out.writerow(sheet.row_values(rx, 0, 2)) 

(在最後一行,則可以在最後兩個參數忽略到row_values()如果整個行包括剛纔那兩個存儲在臨時副本列。那些過去的兩個參數的工作方式類似於啓動和停止的範圍或切片索引,在開始爲包容和停止是獨家

如果你真的需要你的數據,xlrd可讓您方便地訪問一列單元格:

data = zip(sheet.col_values(0, 6), sheet.col_values(1, 6)) 

col_values()的第一個參數是列索引,第二個參數是起始行索引。 (如果你需要在結束之前停下來,你會提供停止行索引的第三個參數,就像我上面的row_values()一樣。)

相關問題