比较python中两个文本文件的行

时间:2013-12-18 13:56:01

标签: python python-2.7

我有两个日志文件,其中包含以下行。我想比较这两个文件中的数据是否相同或不同。

file1.txt736.199070736:的{​​{1}}数据将其整理为一行。 会是这样的

0x000a00f5)

736.199070736: LOG_MOD_L0_RECEIVE_TXBRP_CONTROL(0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5). 中,第一行是:

file2.txt

所以从这两个文件的第一行: 我想比较736.199047132: LOG_TXBP_MOD_IF_RSP_DPCCH(BlockNum: 0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5) 第一行的数据     (0,0x0075007f,0x005500dd,0x007f00d7,0x0057005f,0x00ff007d,0x00f700dd,0x00f50057,0x000a00f5)

和来自file1.txt第一行的数据     (BlockNum:0,0x0075007f,0x005500dd,0x007f00d7,0x0057005f,0x00ff007d,0x00f700dd,0x00f50057,0x000a00f5)

我需要删除file2.txt文字,然后进行比较。

File1.txt包含:

BlockNum:

'file2.txt'包含:

736.199070736:  LOG_MOD_L0_RECEIVE_TXBRP_CONTROL(0, 
 0x0075007f, 
 0x005500dd, 
 0x007f00d7, 
 0x0057005f, 
 0x00ff007d, 
 0x00f700dd, 
 0x00f50057, 
 0x000a00f5)
 736.209069960: LOG_MOD_L0_RECEIVE_TXBRP_CONTROL(0, 
 0x0075007b, 
 0x005500dd, 
 0x007f00d7, 
 0x0057005f, 
 0x00ff007d, 
 0x00f700dd, 
 0x00f50057, 
 0x000a00f1)

我的代码是:

736.199047132:  LOG_TXBP_MOD_IF_RSP_DPCCH(BlockNum: 0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5)
736.209044558:  LOG_TXBP_MOD_IF_RSP_DPCCH(BlockNum: 0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5)

这不能正确地比较我想要的东西。

3 个答案:

答案 0 :(得分:1)

我从您的代码中了解到,将file1的第一行与file2中的所有行进行比较。

你真正想要做的是读取file1中的一行,如果它是不同的reutun“different”并完成,则将它与file2进行比较。否则,完成比较所有行并返回相等。

我不喜欢how to compare lines in two files are same or different in python中的答案,因为它们会加载内存中的所有文件。

我会做的是像

f1 = open("file1")
f2 = open("file2")
line1 = next(f1)
line2 = next(f2)
found_different = False
while line1 and line2:
   if line1 != line2:
      found_different = True
      break
   line1 = next(f1)
   line2 = next(f2)

if not line1 and not line2 and not found_different:
   print "equal"
else:
   print "different"

答案 1 :(得分:1)

不要只是逐行阅读文件,而是过滤每一行:在( )中提取内容,如果存在则删除BlockNum:。像这样:

def getRecords(fn):
    for line in open(fn, 'r'):
        entry = line.rstrip()[line.find('(')+1:-1]
        if entry.startswith('BlockNum:'):
            yield entry[10:]
        else:
            yield entry

import itertools
filesAreEqual = all(a == b for a, b in itertools.izip(getRecords("file1.txt"),
                                                      getRecords("file2.txt")))

答案 2 :(得分:0)

您的问题是在第二个for循环中,您说:

if line==line2:

当它需要时:

if line1==line2:

由于不知道line是什么,因此会出错。经过测试,这是经过纠正的代码。

fin1=open("file1.txt","r")
fin2=open("file2.txt","r")
for line1 in fin1:
    for line2 in fin2:
        if line1==line2:
            print "same data"
        else:
            print "data are different"
fin1.close()
fin2.close()

快乐的编码!