使用Python比较两个不同的csv列时无法获取缺少的元素

时间:2019-03-31 14:19:19

标签: 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列表中不在零售列表中的元素

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的所有元素,而不是丢失的元素

我应该等待元素

x4
x7
..

零售列表中缺少的元素 我不应该等待217个元素吗? 我该怎么办?

1 个答案:

答案 0 :(得分: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)

以便将SKU从CSV阅读器生成的列表中解压缩。

还要注意,您应该将项目列表传递给writer.writerow;否则,您传递给它的字符串将被视为可迭代的,并且您将在每行上看到一个字符:

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