Python CSV:在两个CSV文件中查找相同的数据并复制相应的数据

时间:2018-01-15 09:48:07

标签: python python-3.x csv

Hi Stack Overflow用户,

我对Python很陌生,并且已经从所有问题和答案中取得了很多进展。非常感谢大家的贡献!

过去几天我一直试图解决一个问题,但尽管进行了大量的研究,我仍然无法弄明白。

假设我有两个包含以下数据的CSV文件:

' File1.csv':

sku; title
01001; Product1
01002; Product2
01003; Product3

和' File2.csv':

sku; color
01001; blue
01003; green
01005; red

我希望我的python程序要做的是为File1.csv中的所有SKU添加缺少的数据(颜色)。输出应如下:

' output1.csv':

sku; title; color
01001; Product1; blue
01002; Product2;
01003; Product3; green

我写的Python代码:

import csv

f1 = open('file1.csv', 'r', newline='', encoding='UTF-8')
f2 = open('file2.csv', 'r', newline='', encoding='UTF-8')
f1_reader = csv.reader(f1, delimiter=';')
f2_reader = csv.reader(f2, delimiter=';')

i = 0
j = 0

for row in f1_reader:
    for line in f2_reader:
        if str(row[0]) == str(line[0]):
            print(str(i), str(j), 'Success', str(row[0]), str(line[0]), str(line[1]))
            # Use values to copy the color value to file1.csv
        j = j + 1
    i = i + 1

不幸的是,这段代码不起作用。我得到的唯一输出如下:

1 1 Success sku sku color

我想我的逻辑可能有点偏离这里,但我期待更多的成功'。再一次,我只是Python的初学者,所以我很想知道我的代码有什么问题!

有什么建议吗?

更新

我删除了换行符''和if语句,看看问题可能是什么:

for row in f1_reader:
    for line in f2_reader:
        print('Success', str(row[0]), str(line[0]), str(line[1]))

事实证明我得到以下输出:

Success sku sku  color
Success sku 01001  blue
Success sku 01003  green 
Success sku 01005  red

IndexError: list index out of range

f1_reader不会遍历其所有行,而f2_reader则会迭代。有没有办法让我的代码迭代我的文件,检查相同的行[0]和行[0]'?

以下代码适用于我:

import csv

f1 = open('file1.csv', 'r')
f1_reader = csv.reader(f1, delimiter=';')

for row in f1_reader:
    with open('file2.csv', 'r') as f2:
        f2_reader = csv.reader(f2, delimiter=';')
        for line in f2_reader:
            try:
                if str(row[0]) == str(line[0]):
                    print('Success', str(row[0]), str(line[0]), str(line[1]))
            except IndexError: 
                continue

返回:

Success sku sku  color
Success 01001 01001  blue
Success 01003 01003  green
Success 01005 01005  red

1 个答案:

答案 0 :(得分:2)

你遇到的问题是,一旦你读完f2一次,你就到了文件的末尾。因此它只会将f2与第一个循环进行比较。 当您再次启动循环时,需要一种从文件开头读取f2的方法。我已经编辑了下面的代码,因此除了它之外,它是循环的:

import csv

f1 = open('file1.csv', 'r')
f1_reader = csv.reader(f1, delimiter=';')


i = 0
j = 0

for row in f1_reader:
    f2 = open('file2.csv', 'r')
    f2_reader = csv.reader(f2, delimiter=';')
    for line in f2_reader:

        if row[0] == line[0]:
            print(str(i), str(j), 'Success', str(row[0]), str(line[0]), str(line[1]))
            # Use values to copy the color value to file1.csv


        j = j + 1
    f2.close
    i = i + 1

返回

0 0 Success sku sku  color
1 5 Success 01001 01001  blue
3 14 Success 01003 01003  green