在Python中比较csv文件时循环循环

时间:2017-06-14 19:55:08

标签: python python-3.x

我有两个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的第一行然后关闭,但我不清楚如何阻止它关闭(我也明白这不是最好的方法)。

4 个答案:

答案 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.