【发布时间】: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 CSV:在两个 CSV 文件中查找相同的数据并复制相应的数据 - Python技术站