Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中比较csv文件时在循环中循环_Python_Python 3.x - Fatal编程技术网

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

在Python中比较csv文件时在循环中循环,python,python-3.x,Python,Python 3.x,我有两个csv文件。我试图在一个文件(文件1)的第一列中查找另一个文件(文件2)的第一列中的值。如果匹配,则打印文件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,Bi

我有两个csv文件。我试图在一个文件(文件1)的第一列中查找另一个文件(文件2)的第一列中的值。如果匹配,则打印文件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罗杰

编辑-这些都是示例,实际文件要大得多(5000行,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的第一行,然后关闭,但我不清楚如何阻止它关闭(我也知道这不是最好的方法)。

打开
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]])

我很确定有更好的方法可以做到这一点,但是试试这个解决方案,它应该会起作用

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.

请参阅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文件中,则打印该行。这是一个比您试图做的要快得多的算法。

如果顺序很重要,正如@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])

您是否尝试过在每次迭代中打印出rowcsv1[0]和rowcsv2[0]是什么?很可能是索引不匹配导致了错误。您需要存储所有文件2,但可以对文件1进行一次性迭代。在这种特殊情况下,可能根本不需要csv,因为您可以将行作为字符串进行比较。这些是示例,实际文件要大得多(5000行,7列)。。。5000行算不了什么;如果你有足够的内存,你可以做数千万行。那么我如何让它遍历第2行和第3行呢?我是不是误解了/as?我在python方面太落后了:-(data[row[0]]不是只获取索引[0]处的数据吗?或者这是整行的符号吗?
row[0]
获取您的键值(即46);然后
data[46]
获取相应的行,即
[46,“收到”]
。如果我的csv文件有三列,我还可以使用这种字典式的方法吗?是的,绝对可以。事实上,上面的代码应该按原样工作(假设您只键入一列)。结构与我的类似(for、for、If、action)-是什么在file1的第1行之后停止迭代关闭,就像我的一样?这不是一个解决方案。问题是你只能迭代csv2reader的内容一次;引入一个计数器变量并不能改变这一点。@Hugh Bothwell在这种情况下,用csv的内容填充一个字典,然后遍历它?这是我的首选解决方案-使用一次遍历文件将其存储到内存中以供以后参考。您可以将其存储为列表,但在其中查找值是O(n),而不是O(1);对于这种特殊用法,dict的速度要快得多。这是一个有趣的替代解决方案;请记住,输出的顺序将不同(它将按file2而不是file1的行顺序)。这可能是个问题,也可能不是问题。