2014-02-07 87 views
-1

我必须比较两个文件。比较python中的两个文件?

file1.txt contains:        file2.txt contains: 

    result           result 
    linestarts          print 
    100            100 
    report           foo 
    200            300 
    linestarts          print 
    300            1000 
    500            500 
    code            code 
    linestarts          print 
    600            600 
    900            900 
    .            . 
    .            . 
    .            . 

我需要从linestarts线将其从linestarts为“200”再次开创了linestarts之前file1 .i.e)。以类似的方式从file2.txt中也可以从“print”打印到“300”,然后比较file1和file2..e.e)300和10000,500和500是否相同。同样这一进程将继续,直到file.i.e结束时)我不得不采取从第二linestarts线500 file1.txt并与在FILE2.TXT第二print行“500”进行比较。

我是新来的蟒蛇。我只能取第一套文件1与第一套文件2的比较,但我需要把每一套从linestarts线给它开创了符合linestarts file1中之前从“print”类似的方式找到的前并且必须比较每一组值...它应该像loop ...我不知道python循环太多。如何做到文件结尾?

+2

重复这种可能? https://stackoverflow.com/questions/19007383/compare-two-different-files-line-by-line-in-python – Vader

+0

没有,如果不同@vader – user3116273

回答

0

将两个文件读入列表中,删除非数字的行(linestartsprint),比较filtered列表。

def numeric(s): 
    try: 
     int(s) 
     return True 
    except: 
     return False 

f1 = filter(numeric, open("file1.txt").read().split("\n")) 
f2 = filter(numeric, open("file2.txt").read().split("\n")) 

print f1 
print f2 
print f1 == f2 

输出:

['100', '200', '300', '500', '600', '900'] 
['100', '300', '1000', '500', '600', '900'] 
False 
1

如果意图是分隔符之间的值进行比较,这是很容易的。

首先,获取数据:

with open('/tmp/file1.txt') as f1, open('/tmp/file2.txt') as f2: 
    f1.readline() 
    f2.readline() 
    sep1=f1.readline() 
    sep2=f2.readline() 
    txt1=f1.read() 
    txt2=f2.read() 

data1=[e.strip().splitlines() for e in txt1.split(sep1)] 
data2=[e.strip().splitlines() for e in txt2.split(sep2)] 
print data1 
print data2 

你的榜样,将打印:

[['100', '200'], ['300', '500'], ['600', '900']]  
[['100', '300'], ['1000', '500'], ['600', '900']] 

然后,只需比较子列表:

print [x==y for x, y in zip(data1, data2)] 

打印:

[False, False, True] 

此方法将工作,如果分隔符之间的数据是字符串或数字。

+0

不仅numbers..in DAT地方有机会“串” – user3116273