【问题标题】:Python CSV Reader - Compare Each Row with Each Other Row Within One ColumnPython CSV 阅读器 - 将每一行与一列中的每一行进行比较
【发布时间】:2015-12-31 22:08:47
【问题描述】:

我想将 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 与自身进行比较。对解决方案有什么建议吗?

【问题讨论】:

  • 你的缩进看起来很奇怪,但我认为在你的真实代码中它不是这样的。您能否尝试在 compare_row 的第一个循环内创建一个新的阅读器,而不是为两个循环使用相同的阅读器?

标签: python csv


【解决方案1】:

尝试使用 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 包在这种情况下很有用,因为它针对这类问题进行了优化。

【讨论】:

    【解决方案2】:

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

    您可以将其视为 SQL 语句,对于左表中的每一行,您都希望将其与右表中的值相匹配。因此,您只需扫描 left 表一次,然后开始重新扫描 right 表,直到 left 到达 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)
    

    【讨论】:

    • 感谢回复,但由于 f_right.seek(0) 函数,程序将进入无限循环。我试图找到任何解决方法,但找不到。你能建议可能是什么问题吗?
    • 真的很抱歉,我把 seek(0) 放在了错误的地方。非常感谢您的回答!完成测试后将标记为绿色。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多