Как удалить дубликаты из файла Excel через openpyxl - PullRequest
0 голосов
/ 09 июля 2019

У меня есть два столбца Excel, имя и компания, и я пытаюсь выяснить, как проще всего получить в качестве вывода список кортежей (имя, компания) без дубликатов

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

updated = openpyxl.load_workbook('abc.xlsx')
u_wb = updated.get_sheet_by_name('SP_Table')
u_names = u_wb['F'] #column F is where the names are
u_company = u_wb['C'] #column C is where the company's name are
l=[]

for x in range(len(u_names)-1):
    i=x
    i+=1
    if u_company[x].value==None #in case a field is missing
        continue
    if i==len(u_names):
        break
    for z in l:
        r=(u_names[x].value, u_names[x].value)
        if r==z:
            continue
    else:
        t=(u_names[x].value, u_company[x].value)
        l.append(t)
print("Number of contacts:", len(l))

Я не получаю никакой ошибки и счет контактана самом деле уменьшается, но только из-за предложения u_company[x].value==None.Любая помощь или ресурс приветствуется

Ответы [ 2 ]

1 голос
/ 09 июля 2019

openpyxl имеет мощный API, чтобы упростить подобные вещи

contacts = set() # sets cannot contain duplicates

for row in ws.iter_rows(min_col=2, max_col=6, values_only=True):
    company = row[0]
    name = row[-1]
    if company: # adjust if necessary
        contacts.add((company, name))

print(len(contacts))

В зависимости от того, что вы хотите сделать с контактами, вы можете использовать другую структуру данных, например словарь.

0 голосов
/ 09 июля 2019

Условие, при котором вы пытаетесь игнорировать дубликаты, неверно.

Вы добавляете в список пар (u_names[x].value, u_company[x].value).Это нормально и имеет смысл.Проблема в том, что вы проверяете, есть ли (u_names[x].value, u_names[x].value) в списке.

Кроме того, даже если это было то же самое, вы просто ничего не делаете, когда находите дубликат.Ваш оператор else после for будет всегда выполняться!Это связано с тем, что оператор else после цикла for происходит, когда цикл завершается без нажатия на оператор break.Итак, что вы хотите сделать, это:

for x in range(len(u_names)):
    if u_company[x].value==None #in case a field is missing
        continue

    r = (u_names[x].value, u_company[x].value)
    if r in l:
        continue
    else:
        l.append(t)

print("Number of contacts:", len(l))
...