использование python openpyxl для записи в таблицу Excel (поиск строк) - PullRequest
0 голосов
/ 25 июня 2018

Ниже приведен мой код. Я хочу, чтобы он прочитал электронную таблицу Excel и использовал данные в столбце Warehouse (то есть поиск подстрок в ячейках этого столбца) для сопоставления и записи определенной строки в соответствующую ячейку в следующем столбце с именем GeneralDescription. В моей таблице более 50000 строк. Этот фрагмент кода работает для классификации двух GeneralDescription на данный момент. В конце концов я хочу иметь возможность легко масштабировать это, чтобы охватить все возможные склады. Единственное, что не работает, и что мне нужна конкретная помощь, это то, что когда строка «WORLD WIDE DATA» появляется в столбце Warehouse, код не распознает ее. Я предполагаю из-за всего верхнего регистра. Однако, если строка «HUMANRESOURCES Toronto» появляется в столбце «Склад», этот код работает правильно и записывает «HumanResources» в столбец «GeneralDescription». Он также распознает «WWD» и «wwd» и правильно записывает «World Wide Data» в столбец GeneralDescription. Я не понимаю, почему только одна конкретная строка не распознается, если она не имеет отношения к пробелу. Также в исходной таблице есть целые числа, которые идентифицируют склады. Если я не удаляю их, я не могу перебрать эти строки. Мне нужно сохранить эти цифры там. Любые идеи о том, как я могу сделать эту работу. Любая помощь очень ценится.

import openpyxl
import re

wb = openpyxl.load_workbook(filename="Trial_python.xlsx")

ws= wb.worksheets[0]

sheet = wb.active

for i in range(2, 94000):
    if(sheet.cell(row=i, column=6).value !=None):
        if(sheet.cell(row=i, column=6).value.lower()=="world wide data"):
            sheet.cell(row=i, column=7).value="World Wide Data"
        for j in re.findall(r"[\w']+", sheet.cell(row=i, column=6).value
            if(j.lower()=="wwd" or j.lower()=="world wide data"):
                sheet.cell(row=i, column=7).value="World Wide Data"
            if(j.lower()=="humanresources"):
                sheet.cell(row=i,column=7).value="HumanResources"

wb.save(filename="Trial_python.xlsx")

1 Ответ

0 голосов
/ 26 июня 2018

Я бы порекомендовал создать пустой список, и по мере того, как вы перебираете столбцы, сохраняете каждое из значений там с .append(), это должно помочь вашему коду немного масштабироваться, хотя я уверен, что будут другие другиеэффективные решения.

Я бы также рекомендовал отказаться от использования == для проверки на равенство и попробовать is, эта ссылка подробно описывает различия: https://dbader.org/blog/difference-between-is-and-equals-in-python

Поэтому ваш код должен выглядеть следующим образом:

...
business_list = ['world wide data', 'other_businesses', 'etc']
for i in range(2, 94000):
    if(sheet.cell(row=i, column=6).value is not None):
        if(sheet.cell(row=i, column=6).value.lower() in business_list:
            sheet.cell(row=i, column=7).value = "World Wide Data"
...

Надеюсь, что это поможет

Изменить, чтобы ответить на комментарии ниже

Таким образом, чтобы ответить на ваш вопрос в комментарии 2, business_list = [...]что мы создали, будет хранить все , что вы хотите проверить.то есть.если появятся WWD, World Wide Data, 2467 и т. д., то вы можете проверить этот список, а если совпадение найдено - который использует функцию in - вы можете записать все, что захотите, в столбец 7. (последняя строкакод).

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

...
business_list = ['world wide data', 'other_businesses', '2467',
                 'central operations', 'humanresources']
for i in range(2, 50000):
    if(sheet.cell(row=i, column=6).value is not None):
        if(sheet.cell(row=i, column=6).value.lower() in business_list:
            if business_list[i].lower() == "humanresources":
                sheet.cell(row = i, column = 7).value = "HumanResources"
            if business_list[i].lower() == "machine operations":
                sheet.cell(row = i, column = 7).value = "Machine Operations"
            else:
                 sheet.cell(row = i, column = 7).value = "World Wide Data"
...

Чтобы объяснить, что здесь происходит, создается список со значениями, которые вы хотите проверить, которые называются business_list.Затем вы перебираете свои столбцы и проверяете, что ячейка не пуста с помощью not None:.Отсюда вы делаете начальную проверку, чтобы увидеть, является ли значение ячейки тем, что вы хотите проверить - in business_list:, а если это так, - вы используете индекс того, что он нашел, чтобы идентифицировать и обновить значение ячейки.

Это гарантирует, что вы не проверяете что-то, чего может не быть, сначала проверяя список.Так как значения, которые вы предложили, являются один за одним, т.е.HumanResources для человеческих ресурсов, Machine Operations для машинных операций.

Что касается масштабирования, должно быть легко добавить новые проверки, добавив новое название компании в список, а затем двухстрочный оператор if, тогдаклетка = это.

Я использую аналогичную систему для листа, который составляет примерно 1,2 млн записей, а производительность все еще достаточно высока для производства, хотя я не знаю, насколько сложна ваша.Могут быть и другие, более эффективные способы сделать это, но эта система проста в обслуживании и в будущем, надеюсь, это будет иметь для вас больше смысла.дайте мне знать, если нет, и я помогу, если это возможно

РЕДАКТИРОВАТЬ: Что касается вашего последнего комментария, я бы не предположил что-то подобное без проверки, поскольку это может привести к ложным срабатываниям!

...