Есть ли более pythonic способ пропустить строки в xlsx?
Что я хочу сделать: Пропустите A1: A6, Пропустите B1: B6 и сохраните остальные в csv. Эквивалентно, я хочу сохранить A7: B+ws.max_row
в csv.
Мой подход:
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
и вручную выберите A, затем выберите B. (Я хочу пропустить точное количество строк для A и B)
- Python: поиск определенного слова или значений в файле excel
- как быстрее получить доступ к значениям ячеек с помощью openpyxl?
- Openpyxl: ширина столбца не работает корректно в окнах
- Как вычесть значения ячеек из одного столбца с значениями ячейки из другого столбца в файлах xlsx с помощью python
- Python 3 - Написание ключевых слов и значений словаря для ячеек Excel
Мой вопрос: есть ли более pythonic способ пропустить строки в xlsx?
- Использование Named Ranges в Excel с выбором ячеек?
- Python - применить форматирование существующей книги к другой книге
- Какова эквивалентная функция в openpyxl?
- Поддельные ячейки «Нет», загруженные в начале столбцов openpyxl
- Python openpyxl не позволяет сохранить существующий excel с настройкой ширины столбца
- Openpyxl, итерация через ячейки, не может сравнивать ячейки с строкой
- Поиск списка номеров строк на основе значений в отдельных столбцах?
- Скорость поиска ячеек Openpyxl
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.sheetnames
и wb[sheetname]
.
Для меня самой простой задачей было просто начать с 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()
выше).