2016-10-28 4 views
0

Что я хочу делать: Пропустить A1: A6, Пропустить B1: B6 и сохранить остальные в csv. Эквивалентно, я хочу сохранить A7: B+ws.max_row в csv.Есть ли более pythonic способ пропустить строки в xlsx?

Мой подход:

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. (Я хочу, чтобы пропустить точно такое же количество строк для А и В)

Мой вопрос: Есть ли более pythonic способ пропустить строки в xlsx?

+0

Не могли бы вы 'zip (лист ['A'], лист [ 'B']) 'или возможно' для строки в листе ['A: B'] '(я не знаком с этим пакетом, так что это просто догадки с моей стороны) –

+0

Я пробовал' zip (sheet ['A7 ':' the_max_row '], лист [' B7 ':' the_max_row ']) ', но он возвращает только набор ячеек, но не может вернуть значение ячеек. –

+0

Если вы можете получить кортеж клеток, не можете ли вы работать с ячейками в каждом кортеже? –

ответ

2

openpyxl 2.4 ввел метод iter_cols() для рабочих листов (NB. Он не доступен для рабочих листов только для чтения), так что вы можете просто сделать что-то вроде

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.sheetnames и wb[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() выше.)

Смежные вопросы