Найдите соответствующий элемент в строке CSV и обработайте его дальше - PullRequest
0 голосов
/ 10 марта 2020

CSV-файл продолжается в строке несколько имен файлов изображений. Эти изображения визуализируются в grid из tkinter. На самом деле визуализация имеет тот же формат (положение имени файла изображений), что и файл csv.

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

Пример того, как может выглядеть мой CSV-файл (в коде с именем results.csv):

a.jpg, b.jpg, a.jpg, c.jpg, d.jpg
x.jpg, y.jpg, y.jpg, y.jpg, z.jpg

Как я описал выше и для этого примера Я хочу нарисовать для первого ряда зеленые границы вокруг a.jpg и для второго ряда вокруг изображения x.jpg, так как эти изображения в строке совпадают.

Согласно этой логике c мой код выглядит так:

def visualize_results(feature):
    """Visualize result images in a grid like the original gui"""
    with open("results.csv", 'r') as input:
        reader = csv.reader(input, delimiter=',')
        i = 0
        for row in reader:
            for j, col in enumerate(row):

                tk.Label(text="", width=25).grid(row=0, column=j)
                # dataset is a path to a dataset 
                # and col is the filename of an image in the csv file (as in the example a.jpg...)
                image = Image.open(dataset + col)
                image = image.resize((50, 50), Image.ANTIALIAS)
                photo = ImageTk.PhotoImage(image)

                # compare every id in each row and if same, draw a green border

                if col in row[i]:
                    label = tk.Label(image=photo, width=50, height=50,
                                     highlightthickness=4, highlightbackground="GREEN", borderwidth=0)
                else:
                    label = tk.Label(image=photo, width=50, height=50,
                                     highlightthickness=4, highlightbackground="RED", borderwidth=0)

                label.image = photo  # this line need to prevent gc
                label.grid(row=i + 1, column=j)

            i += 1

    tk.mainloop()

Теперь с этим кодом я получаю исключение IndexError: list index out of range. Почему это так и как я могу это изменить?

1 Ответ

1 голос
/ 10 марта 2020

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

Проблема поиска дубликатов в списке легко решается с помощью list.count()

for j, col in enumerate(row):
    if row.count(col) > 1:
        handle_duplicates()
    else:
        handle_no_duplicates()

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

for j, col in enumerate(row):
    if col in row[1:]:
        handle_duplicates()
    else:
        handle_no_duplicates()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...