有没有一种方法可以在Python中比较CSV而不忽略行顺序?

时间:2020-05-29 14:32:02

标签: python windows csv

我正在设置一个自动作业,该作业需要解析ftp站点中的csv文件,每个文件包含几万行。我想在解析其余文件之前对目录进行预处理以消除重复的文件。问题是重复的文件被推送到ftp,但行顺序不同(即相同的数据,不同的顺序)。这导致具有不同哈希值和逐字节比较的“重复文件”。只需最少的处理。

我希望将文件操作降至最低,因此我尝试使用csvsort模块对CSV进行排序,但这给了我一个索引错误:IndexError: list index out of range。这是相关的代码:

from csvsort import csvsort
csvsort(input_filename=file_path,columns=[1,2])

我尝试查找并消除空行,但这似乎不是问题,并且正如我所说,我希望将文件操作保持在最低限度,以保持文件完整性。而且,我无法控制文件的创建或将文件推送到ftp

我可以想到多种方法来解决此问题,但是它们都涉及打开CSV并读取内容,对其进行处理等。无论如何,我可以做一个轻量级的文件比较,而忽略行顺序或我必须去加重处理吗?

2 个答案:

答案 0 :(得分:0)

您没有指定您拥有多少数据。我对此的看法会因大小而异。我们在说100条线吗?还是几百万行?

如果行数很少,则可以轻松地对行进行排序。但是,如果数据变长,则可以使用其他策略。

我以前已经使用AWK解决了“从文件A中删除出现在文件B中的行”的问题,因为AWK只需在长文件(A)中运行1次就可以做到这一点,从而使处理过程非常快。但是,您可能需要调用一个外部程序。不确定这对您是否理想。

如果您的行不完全相同-假设您只需要比较几个字段之一-AWK也可以这样做。只需将字段提取到变量中即可。

如果您选择采用这种方式,则脚本是这样的:

FNR==NR{
a[$0]++;cnt[1]+=1;next
}

!a[$0]

一起使用
c:\path\to\awk.exe  -f awkscript.awk   SMALL_LIST   FULL_LIST  > DIFF_LIST

DIFF_LIST是FULL中的不属于小项目。

答案 1 :(得分:0)

因此,事实证明pandas具有内置的散列函数,可以选择忽略索引。由于哈希是在每一行上计算的,因此您需要运行附加的sum函数。就代码而言,它就像我希望的那样轻巧,就运行时而言,它在约5秒内解析了约15个文件(约3万行,每个文件17列)。

from pandas import read_csv
from pandas.util import hash_pandas_object
from collections import defaultdict

duplicate_check = defaultdict(list)
for f in files:
    duplicate_check[hash_pandas_object(read_csv(f),index=False).sum()].append(f)
相关问题