Как сравнить два неупорядоченных столбца по значению с openpyxl и распечатать результаты для каждой строки? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть файл Excel с двумя столбцами. Значения в столбцах неупорядочены. Я точно знаю, что некоторые ячейки из исходного столбца существуют в целевом столбце, который длиннее (240 строк по сравнению с 191). Как я могу проверить, существует ли значение из исходного столбца в целевом столбце, а затем распечатать в столбец справа от целевого столбца строка за строкой, то есть «проверить», существует ли значение из источника, и «отсутствует», если нет ?

Я предполагаю, что он должен следовать этому logi c, но само сравнение значений кажется мне сложным:

    for (source_row, target_row) in zip(ws.iter_rows(min_row=2, max_col=3, max_row=240),
                                        ws.iter_rows(min_row=2, max_col=7, max_row=240)):
        for (source_cell, target_cell) in zip(source_row, target_row):
            if target_cell in source_row: # doesn't seem to work
                ws.cell(column=10, row=target_cell.row).value = "check"
                break
            else:
                ws.cell(column=10, row=target_cell.row).value = "missing"
                break

1 Ответ

0 голосов
/ 18 июня 2020

Для такого рода вещей вам следует избегать использования вложенных циклов. Мало того, что они не обязательно будут работать в этом случае, потому что вы проверяете только ячейку с ячейкой, а не ячейку с набором значений, вложенные циклы могут, кхм, быстро стать медленными, но также затруднить отладку и управление потоком.

Если вы просто хотите знать, какие значения находятся в каждом столбце.

source = set((r[0] for r in ws.iter_rows(min_row=2, max_row=240, min_col=3, max_col=3, values_only=True))
target = set((r[0] for r in ws.iter_rows(min_row=2, max_row=240, min_col=7, max_col=7, values_only=True))

missing_value = target - source

You can now loop over the source cells and do the comparison:

for row in ws.iter_rows(min_row=2, max_row=240, min_col=3, max_col=3):
    for c in row:
        value = c.value in target and "check" or "missing"
        c.offset(rows=7).value = value
...