我有两个csv文件。我试图在另一个文件(文件2)的第一列中的一个文件(文件1)中查找第一列的值。如果匹配,则打印文件2中的行。
伪代码:
read file1.csv
read file2.csv
loop through file1
compare each row with each row of file 2 in turn
if file1[0] == file2[0]:
print row of file 2
文件1:
45,John
46,Fred
47,Bill
文件2:
46,Roger
48,Pete
49,Bob
我想要打印:
46 Roger
编辑 - 这些是示例,实际文件要大得多(5,000行,7列) 我有以下内容:
import csv
with open('csvfile1.csv', 'rt') as csvfile1, open('csvfile2.csv', 'rt') as csvfile2:
csv1reader = csv.reader(csvfile1)
csv2reader = csv.reader(csvfile2)
for rowcsv1 in csv1reader:
for rowcsv2 in csv2reader:
if rowcsv1[0] == rowcsv2[0]:
print(rowcsv1)
然而我没有输出。
我知道还有其他方法可以做到这一点(使用dict,pandas)但我很想知道为什么我的方法无效。
编辑:我现在看到它只是遍历文件1的第一行然后关闭,但我不清楚如何阻止它关闭(我也明白这不是最好的方法)。
答案 0 :(得分:5)
你打开csv2reader = csv.reader(csvfile2)
然后再次遍历csv1reader
的第一行 - 它现在已经到达文件末尾并且不再生成任何数据。
因此,对于csv1reader
的第二行到最后一行,您要与空列表的项目进行比较,即不进行比较。
无论如何,这是一种非常低效的方法;除非你正在处理非常大的文件,否则做得更好
import csv
# load second file as lookup table
data = {}
with open("csv2file.csv") as inf2:
for row in csv.reader(inf2):
data[row[0]] = row
# now process first file against it
with open("csv1file.csv") as inf1:
for row in csv.reader(inf1):
if row[0] in data:
print(data[row[0]])
答案 1 :(得分:1)
请参阅Hugh Bothwell的答案,了解您的代码无效的原因。要想快速完成您在问题中想要做的事情,请尝试以下方法:
import csv
with open('csvfile1.csv', 'rt') as csvfile1, open('csvfile2.csv', 'rt') as csvfile2:
csv1 = list(csv.reader(csvfile1))
csv2 = list(csv.reader(csvfile2))
duplicates = {a[0] for a in csv1} & {a[0] for a in csv2}
for row in csv2:
if row[0] in duplicates:
print(row)
它从两个csv文件中获取重复的数字,然后遍历第二个cvs文件,如果索引0处的数字在第一个cvs文件中,则打印该行。这是一个比你试图做的更快的算法。
答案 2 :(得分:0)
如果订单很重要,就像在@ will-da-silva的回答中提到的@ hugh-bothwell一样,你可以这样做:
import csv
from collections import OrderedDict
with open('csvfile1.csv', 'rt') as csvfile1, open('csvfile2.csv', 'rt') as csvfile2:
csv1 = list(csv.reader(csvfile1))
csv2 = list(csv.reader(csvfile2))
d = {row[0]: row for row in csv2}
k = OrderedDict.fromkeys([a[0] for a in csv1]).keys()
duplicate_keys = [k for k in k if k in d]
for k in duplicate_keys:
print(d[k])
答案 3 :(得分:-1)
我很确定有更好的方法可以做到这一点,但尝试这个解决方案,它应该可行。
counter = 0
import csv
with open('csvfile1.csv', 'rt') as csvfile1, open('csvfile2.csv', 'rt') as
csvfile2:
csv1reader = csv.reader(csvfile1)
csv2reader = csv.reader(csvfile2)
for rowcsv1 in csv1reader:
for rowcsv2 in csv2reader:
if rowcsv1[counter] == rowcsv2[counter]:
print(rowcsv1)
counter += 1 #increment it out of the IF statement.