Не удается получить недостающие элементы при сравнении двух разных столбцов csv с использованием Python

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть два CSV-файла, первый содержит около 420 значений в строках в одном столбце, второй содержит около 203 строк с 6 столбцами

Файл 1

 x1
x2
x3

...
  

Файл 2

 x1;a1;b1;c1;d1;e1
x2;a1;b1;c1;d1;e1
x3;a1;b1;c1;d1;e1
x5;a1;b1;c1;d1;e1
x6;a1;b1;c1;d1;e1
  

Я пытаюсь следующим способом поместить их в два разных списка

 skuslist =[]
retaillist =[]

def myskus():
    contents = []
    with open('SKUS.csv', 'r', encoding='utf-8',newline='') as csvf:
        reader = csv.reader(csvf, delimiter=";")
        for row in reader:
            contents.append(row)  # Add each sku to list contents
    return contents

def myretails():
    retails = []
    with open('retails_csv.csv', 'r', encoding='utf-8',newline='') as csvf:
        reader = csv.reader(csvf, delimiter=";")
        for row in reader:
            retails.append(row[0])
    return retails

skuslist = myskus()
retaillist = myretails()
  

и экспортируйте элементы в списке SKU, которых нет в retaillist

 with open('export.csv', 'w', newline='') as f:
    writer = csv.writer(f, delimiter='n')
    for item in skuslist:
        if item not in retaillist:
            writer.writerow(item)
  

Вместо получения недостающих элементов я получаю ВСЕ элементы списка SKU 420 count

Я должен ждать элементов

 x4
x7
..
  

Элементы, отсутствующие в списке розничной продажи
Разве я не должен ждать 217 элементов?
Как я могу это сделать?

Ответ №1:

csv.reader выдает список элементов, поэтому, когда вы делаете:

 for row in reader:
    contents.append(row)  # Add each sku to list contents
  

он добавляет список, а не строку, в contents список, для каждой итерации цикла, поэтому, когда вы:

 for item in skuslist:
  

item становится списком из одного элемента, а не строкой.

Измените его на:

 for sku, in reader:
    contents.append(sku)
  

таким образом, артикул распаковывается из списка, который генерирует программа чтения CSV.

Также обратите внимание, что вы должны передать список элементов в writer.writerow ; в противном случае строка, которую вы передаете ей, будет обрабатываться как итерируемая, и вы увидите один символ в каждой строке:

 writer = csv.writer(f)
for item in skuslist:
    if item not in retaillist:
        writer.writerow([item])
  

Комментарии:

1. Даже в этом случае item или [элемент] Я получаю весь начальный список, а не те, которые отсутствуют

2. Поскольку каждый элемент в skulist теперь является списком, который не может быть равен элементам в retaillist , которые являются строками, поэтому if item not in retaillist: всегда вычисляется как True .

3. Как я могу это исправить, чтобы получить недостающие элементы?

4. Я уже показал вам, как это исправить в моем ответе. Пожалуйста, прочтите это и попробуйте. Как часть «Измените это на:», так и нижняя часть.

5. Я пробовал это 🙂 но я получаю [‘x1’] [‘x2’] и т.д. В каждой строке общее количество 420