OpenPyXl - цикл по ячейкам до состояния - PullRequest
0 голосов
/ 03 января 2019

В столбце A Excel есть много строк с разными значениями. Пример:

613
613
613
625
625
631
631...etc

Я хочу перебрать столбец A и, когда значение ячейки ссылается на новое значение, получить строку ячейки.

Пример ожидаемого результата: Когда значение ячейки изменилось на 625, оно вернет строку 4. Когда 631, 6 и т. Д.

Это мой код:

from openpyxl import Workbook, load_workbook

wb = load_workbook("Workbook.xlsx")
ws = wb.active
sheet = wb["Visual Query2"]

for row in ws.iter_rows(min_row=1, max_col=1, max_row=223181):
    for cell in row::
           print(cell.row)

Я немного растерялся, пытаясь поймать, когда ячейка начинает иметь другое значение. Если кто-то может дать мне руководство, я буду очень признателен. Спасибо.

Редактировать: Не удалось найти временное решение, используя:

wb = load_workbook("Workbook.xlsx")
ws = wb.active
sheet = wb["Sheet"]

for fila in ws.iter_rows('A2:A7'):
    for celda in fila:
        if celda.value != celda.offset(-1, 0).value:
            print(celda.row)

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Возможно, самый простой подход - использование zip, но для этого потребуется загрузка всех строк в память и создание 2 списков, что может быть непросто, если на самом деле у вас 2 миллиона строк:

li = [1, 1, 2, 2, 3, 3, 1, 1, 2, 1, 2, 3]
print([index + 1 for index, (a, b) in enumerate(zip(li[:-1], li[1:])) if a != b])
#  [2, 4, 6, 8, 9, 10, 11]

Более консервативный способ - «кэшировать» последнее значение:

li = [1, 1, 2, 2, 3, 3, 1, 1, 2, 1, 2, 3]
previous = None
for index, n in enumerate(li):
    if previous is None:
        previous = n
        continue
    if previous != n:
        print(index)
    previous = n

выходы

2
4
6
8
9
10
11
0 голосов
/ 03 января 2019

Чтобы отслеживать, когда значение изменилось, вы можете использовать переменную для записи последнего значения:

def return_first_of_kind(iterable, key):
    previous_value = None
    for value in iterable:
        if key(value) != previous_value:
            yield value
        previous_value = key(value)

. Используется как:

def cell_a_value(row):
    return row[0].value

for row in return_first_of_kind(ws.iter_rows(), key=cell_a_value):
    print(row)

Iзабыл, как получить значение первого столбца из строки таблицы openpyxl, обновите функцию cell_a_value по мере необходимости.

0 голосов
/ 03 января 2019

Если вы хотите изменить как можно меньше в своем текущем коде, я бы предложил сохранить последнее значение в некоторой временной переменной, которую вы пишете каждый раз, когда переходите к следующей строке. Вы сравниваете код страны текущей строки с кодом страны предыдущей строки и, если они отличаются, вы печатаете индекс строки. Если индекс строки недоступен, вы можете реализовать свою собственную переменную-счетчик, которая отслеживает, по какому индексу вы находитесь. Возможно, существуют более элегантные решения, но они будут работать.

Вот пример реализации, которую я описал выше:

i = 0
temp = None
for row in ws.iter_rows(min_row=1,max_col=1,max_row=223181):
    for cell in row:
        if cell.value != temp:
            print(i)
        temp = cell.value
    i += 1

Возможно, вы захотите найти другой способ назначения временной переменной в первый раз. Это напечатает первое значение независимо от того, что.

Решение с наибольшим количеством голосов здесь обеспечивает более элегантное решение проблемы печати индекса. Кроме того, эта документация говорит нам, что есть более чистый способ открытия и чтения файла (см. Раздел «Только для чтения»).

...