繁体   English   中英

Python CSV阅读器-比较一列中的每一行和每一行

[英]Python CSV Reader - Compare Each Row with Each Other Row Within One Column

我想将CSV文件的每一行与其自身以及一列中的每一行进行比较。
例如,如果列值是这样的:

值_1
值_2
值_3

该代码应选择Value_1,并将其与Value_1(是,也与自身)进行比较,然后将Value_2与Value_3进行比较。 然后,它应该选择Value_2,并将其与Value_1,Value_2,Value_3等进行比较。

为此,我编写了以下代码:

csvfile = "c:\temp\temp.csv"
with open(csvfile, newline='') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        for compare_row in reader:
            if row == compare_row
                print(row,'is equal to',compare_row)
            else:
                print(row,'is not equal to',compare_row)

该代码提供以下输出:

['Value_1'] is not equal to ['Value_2']
['Value_1'] is not equal to ['Value_3']

该代码将Value_1与Value_2和Value_3进行比较,然后停止。 循环1不会选择Value_2和Value_3。 简而言之,第一个循环似乎在停止之前仅对CSV文件的第一行进行迭代。

另外,我无法使用此代码将Value_1与自身进行比较。 对解决方案有什么建议吗?

我建议将CSV加载到内存中,但是考虑到大小,这不是一个选择。

而是将其视为SQL语句,对于左表中的每一行,您都希望将其与右表中的值进行匹配。 因此,您将只扫描左侧表格一次,然后开始重新扫描右侧表格,直到左侧达到EoF。

with open(csvfile, newline='') as f_left:
    reader_left = csv.reader(f_left, delimiter=',')
    with open(csvfile, newline='') as f_right:
        reader_right = csv.reader(f_right, delimiter=',')
        for row in reader_left:
            for compare_row in reader_right:
                if row == compare_row:
                    print(row,'is equal to',compare_row)
                else:
                    print(row,'is not equal to',compare_row)
            f_right.seek(0)

尝试使用来自Python的内置包: Itertools

from itertools import product

with open("abcTest.txt") as inputFile:
    aList = inputFile.read().split("\n")
    aProduct = product(aList,aList)
    for aElem,bElem in aProduct:
        if aElem == bElem:
            print aElem,'is equal to',bElem
        else:
            print aElem,'is not equal to',bElem

您面临的问题在Python中称为笛卡尔积,我们需要将数据行与其自身以及每隔一行进行比较。

为此,如果您要多次读取源文件,那么如果文件很大,则会导致明显的性能问题。 取而代之的是,您可以将数据存储在列表中,并在多个时间进行迭代,但这也将带来巨大的性能开销。

在这种情况下,itertool软件包非常有用,因为它针对此类问题进行了优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM