比较来自Python中具有百万条记录的2个文件的数据

时间:2014-11-26 05:59:30

标签: python compare

我有2个文件old.txt和new.txt包含数十万个数据(接近约120万个密钥和相应金额)

new.txt

key |amount
abgc-nhd|8976
mkis-plqa-d|-254
mjsnh-kis-ls|987
njud-lo-sa|5291
mkjsh-kis-ls|686
mjsnh-fis-ls|387
njudd-kid-ls|-876
nswxd-lo-sa|3191
mki-ksjd-as|-56

old.txt

key |amount
mkjsh-kis-ls|686
njudd-kid-ls|-876
abgc-nhd|8976
mjsnh-kis-ls|987
njud-lo-sa|5291
mjsnh-fis-ls|387
mkis-plqa-d|-254
nswxd-lo-sa|3191

我想比较这两个文件。

ieI我想检查旧文件中的密钥是否与新文件中的密钥匹配。如果是,那么我必须比较它们的数量。

我尝试将所有值插入字典中,然后检查条目是否存在,但这需要更长的时间并且系统被挂起。

还有其他方法可以在密钥的基础上比较两个文件。

感谢。

3 个答案:

答案 0 :(得分:2)

如果你可以使用pandas,你可以这样做:

new_txt = """key |amount
abgc-nhd|8976
mkis-plqa-d|-254
mjsnh-kis-ls|987
njud-lo-sa|5291
mkjsh-kis-ls|686
mjsnh-fis-ls|387
njudd-kid-ls|-876
nswxd-lo-sa|3191
mki-ksjd-as|-56"""

old_txt  = """key |amount
mkjsh-kis-ls|686
njudd-kid-ls|-876
abgc-nhd|8976
mjsnh-kis-ls|987
njud-lo-sa|5291
mjsnh-fis-ls|387
mkis-plqa-d|-254
nswxd-lo-sa|3191"""


import pandas as pd
import io

df_new = pd.DataFrame.from_csv(io.StringIO(new_txt), sep="|")
df_old = pd.DataFrame.from_csv(io.StringIO(old_txt), sep="|")

print(df_new - df_old)

这给出了示例数据:

abgc-nhd           0
mjsnh-fis-ls       0
mjsnh-kis-ls       0
mki-ksjd-as      NaN
mkis-plqa-d        0
mkjsh-kis-ls       0
njud-lo-sa         0
njudd-kid-ls       0
nswxd-lo-sa        0

NaN表示此密钥仅存在于一个集合中。

答案 1 :(得分:0)

import csv

with open('new.txt') as infile:
    records = {}
    for k,v in csv.reader(infile):
        records[k] = int(v)

with open('old.txt') as infile:
    for k,v in csv.reader(infile):
        if records[k] != int(v):
            print("There is a mismatch in key", k)

答案 2 :(得分:0)

从您的代码段中,我看到文件中的条目未排序。因此,一个快速的解决方案是对文件的条目进行排序(如果顺序无关紧要),并比较两个文件中的行。

排序之后,比如说,file1中的line1以“abm ...”开头。& file2中的line1以“bcn ...”开头,然后没有必要检查以“a ...”开头的剩余条目对着file2中的行,因为没有这样的东西。
继续下一行并检查所有剩余的行。您还可以打印那些仅匹配的行并将其写入单独的文件中。此文件将只包含具有“常用”键的行。

此算法应该比O(n ^ 2)快。