PythonCSV阅读器-将一列中的每一行与另一行进行比较

PythonCSV阅读器-将一列中的每一行与另一行进行比较,python,csv,Python,Csv,我想将CSV文件的每一行与自身以及列中的每一行进行比较例如,如果列值如下所示: 值_1 值_2 价值3 代码应该选择值_1并将其与值_1(是的,也与自身)、值_2进行比较,然后与值_3进行比较。然后它应该提取值_2并将其与值_1、值_2、值_3等进行比较 为此,我编写了以下代码: csvfile = "c:\temp\temp.csv" with open(csvfile, newline='') as f: reader = csv.reader(f, delimiter=',')

我想将CSV文件的每一行与自身以及列中的每一行进行比较
例如,如果列值如下所示:

值_1
值_2
价值3

代码应该选择值_1并将其与值_1(是的,也与自身)、值_2进行比较,然后与值_3进行比较。然后它应该提取值_2并将其与值_1、值_2、值_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']
代码将值_1与值_2和值_3进行比较,然后停止。循环1不拾取值_2和值_3。简而言之,在停止之前,第一个循环似乎仅迭代CSV文件的第一行


此外,我无法使用此代码将值_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)

我会建议将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中的内置包:

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

为此,如果您从源代码多次读取,那么如果文件很大,将导致显著的性能问题。 相反,您可以将数据存储在列表中并多次迭代,但这也会带来巨大的性能


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

尝试使用Python的内置包:

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

为此,如果您从源代码多次读取,那么如果文件很大,将导致显著的性能问题。 相反,您可以将数据存储在列表中并多次迭代,但这也会带来巨大的性能


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

您的缩进看起来很奇怪,但我认为在实际代码中不是这样的。您是否可以尝试在第一个循环中为compare_行创建一个新的读取器,而不是对两个循环使用相同的读取器?您的缩进看起来很奇怪,但我认为在实际代码中不是这样的。您是否可以尝试在第一个循环中为比较行创建一个新的读卡器,而不是在两个循环中使用相同的读卡器?谢谢您的回复,但由于f_right.seek(0)函数,程序将进入无限循环。我试图找到任何解决办法,但没有找到。您能提出可能的问题吗?非常抱歉,我将seek(0)放在了错误的位置。谢谢你的回答!完成测试后,将标记为绿色。:)感谢您的回复,但由于f_right.seek(0)函数的作用,程序将进入无限循环。我试图找到任何解决办法,但没有找到。您能提出可能的问题吗?非常抱歉,我将seek(0)放在了错误的位置。谢谢你的回答!完成测试后,将标记为绿色。:)