逐行比较文件以查看它们是否相同,如果是这样则输出它们

时间:2012-06-28 22:12:52

标签: python slider analytics match string-matching

我将如何解决这个问题,我有我已经对信息进行排序的文件,我想将该文件中的某个索引与另一个索引进行比较,一个问题是文件非常大,数百万行。我希望逐行比较我拥有的文件,如果匹配,我想使用索引方法将这些值与其他值一起输入。

=======================

让我澄清,我想说行[x] x将保持相同,因为它统一格式化,我想在另一个文件中对行[y]运行行[x],我想这样做到整个文件并将每个匹配对输出到另一个文件。在那个其他文件中,我还希望能够包含第一个文件中的其他部分,就像添加更多索引一样;行[a],行[b],行[c],行[d],最后行[y]作为与该信息的匹配。

尝试3:

我有一个包含以下格式信息的文件:

#x是一行

 x= data,data,data,data,data,data

有数百万行。

我有另一个文件,格式相同:

    xis a line
    x= data,data,data,data

我想使用第一个文件中的x [#]和第二个文件中的x [#],我想看看这两个值是否匹配,如果它们我想要输出那些,以及其他几个x [#]第二个文件中的值,它们位于同一行。

这有助于理解吗? 文件所在的格式就像我说的那样:(但是有数百万,我想找到两个文件中的对,因为它们都应该匹配)

  line 1  data,data,data,data
  line 2  data,data,data,data

文件1中的数据:

 (N'068D556A1A665123A6DD2073A36C1CAF', N'A76EEAF6D310D4FD2F0BD610FAC02C04DFE6EB67',    
N'D7C970DFE09687F1732C568AE1CFF9235B2CBB3673EA98DAA8E4507CC8B9A881');

文件2中的数据:

00000040f2213a27ff74019b8bf3cfd1|index.docbook|Redhat 7.3 (32bit)|Linux
00000040f69413a27ff7401b8bf3cfd1|index.docbook|Redhat 8.0 (32bit)|Linux
00000965b3f00c92a18b2b31e75d702c|Localizable.strings|Mac OS X 10.4|OSX
0000162d57845b6512e87db4473c58ea|SYSTEM|Windows 7 Home Premium (32bit)|Windows
000011b20f3cefd491dbc4eff949cf45|totem.devhelp|Linux Ubuntu Desktop 9.10 (32bit)|Linux

它的排序顺序是字母数字,我想使用滑块方法。我的意思是,如果file1 [x]是< file2 [x]向下或向上移动滑块,具体取决于一个值是否大于另一个值,直到找到匹配为止,如果是,则何时打印输出以及将识别该哈希值的其他值。

我想要的结果是:

file1 [x]及其对应的file2 [x]匹配输出到文件,以及其他file1 [x],其中x可以是该行的任何索引。

3 个答案:

答案 0 :(得分:3)

使用此方法并逐行比较,您不必将文件存储在内存中,因为文件很大。

with open('file1.txt') as f1, open('file2.txt') as f2, open('file3.txt','w') as f3:
    for x, y in zip(f1, f2): 
        if x == y:
            f3.write(x)

答案 1 :(得分:2)

我从澄清中得到了什么:

  • file1和file2采用相同的格式,每行看起来像

    {32 char hex key}|{text1}|{text2}|{text3}
    
  • 文件按键按升序排序

  • 对于file1和file2中出现的每个键,您需要合并输出,因此每行看起来像

    {32 char hex key}|{text11}|{text12}|{text13}|{text21}|{text22}|{text23}
    

你基本上想要合并排序中的碰撞:

import csv

def getnext(csvfile, key=lambda row: int(row[0], 16)):
    row = csvfile.next()
    return key(row),row

with open('file1.dat','rb') as inf1, open('file2.dat','rb') as inf2, open('merged.dat','wb') as outf:
    a = csv.reader(inf1, delimiter='|')
    b = csv.reader(inf2, delimiter='|')
    res = csv.writer(outf, delimiter='|')

    a_key, b_key = -1, 0
    try:
        while True:
            while a_key < b_key:
                a_key, a_row = getnext(a)
            while b_key < a_key:
                b_key, b_row = getnext(b)
            if a_key==b_key:
                res.writerow(a_row + b_row[1:])
    except StopIteration:
        # reached the end of an input file
        pass

我仍然不知道你正在尝试通过'以及其他file1 [x]进行通信,其中x可以是来自该行的任何索引。

答案 2 :(得分:1)

比较指定索引处的两个文件的内容:

fp1 = open("file1.txt", "r")
fp2 = open("file2.txt", "r")

fp1.seek(index)
fp2.seek(index)

line1 = fp1.readline()
line2 = fp2.readline()

if line1 == line2:
    print(line1)

fp1.close()
fp2.close()

逐行比较两个文件以查看它们是否匹配,否则打印行:

fp1 = open("file1.txt", "r")
fp2 = open("file2.txt", "r")

line1, line2 = fp1.readline(), fp2.readline()

while line1 and line2:
    if line1 != line2:
        print("Mismatch.\n1: %s\n2: %s" % (line1, line2))

fp1.close()
fp2.close()