PythonCSV阅读器-将一列中的每一行与另一行进行比较
我想将CSV文件的每一行与自身以及列中的每一行进行比较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=',')
例如,如果列值如下所示: 值_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)放在了错误的位置。谢谢你的回答!完成测试后,将标记为绿色。:)