有没有一种方法可以在忽略行顺序的情况下比较Python中的CSV?

2024-05-18 18:22:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设置一个自动作业,需要解析来自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、读取内容、操作它等等。我是否可以进行忽略行顺序的轻量级文件比较,或者我必须进行更繁重的处理


Tags: 模块文件csv数据目录排序顺序站点
2条回答

您不指定有多少数据。我对这个的看法会因尺寸不同而有所不同。我们说的是100行吗?还是几百万行

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

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

如果您的行不完全相同(假设您只需要比较几个字段中的一个),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

差异列表是指从完整列表中选择的不在小列表中的项目

因此,pandas有一个内置的哈希函数,可以选择忽略索引。由于哈希是在每行上计算的,因此需要运行额外的求和函数。就代码而言,它几乎是我所希望的轻量级,就运行时而言,它在5秒内解析了15个文件(每个文件中有30k行,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)

相关问题 更多 >

    热门问题