【问题标题】:Python CSV: Find identical data in two CSV files and copy corresponding dataPython CSV:在两个 CSV 文件中查找相同的数据并复制相应的数据
【发布时间】:2023-04-03 05:40:01
【问题描述】:

您好 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 的初学者,所以我很想知道我的代码有什么问题!

有什么建议吗?

更新

我删除了 newline='' 和 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

【问题讨论】:

  • 您使用newline='' 打开文件,这意味着每个文件只有一行,因为您没有指定换行符。我建议您删除它,这将导致使用默认的换行符\n。然后再看看哪里出错了。 (提示:注意如果你已经通过了 file-2 一次会发生什么)
  • 感谢您的意见,埃德温!请在下面查看我的更新:我删除了 newline='',但它仍然没有遍历第一个文件 :(
  • 正确,它通过file-2(这是内部循环)一次,然后到达文件结尾,所以它不会再通过它(从外部换行循环比较)...我建议您在 for row in f1_reader: 之后使用 f2.seek(0) ,这会将 f2 返回到文件顶部以进行下一次迭代。效率不是很高,但它会帮助你理解文件操作。

标签:
python
python-3.x
csv