2012-02-29 19 views
4

给定两个文本文件A,B,获取B中行数不在A中的简单方法是什么?我看到有difflib,却看不到一个接口,用于检索行号获取已更改的行数

+0

你只是寻找文件B不在一个系?线的顺序是否重要? – 2012-02-29 20:08:21

+0

difflib可以给你[统一差异](http://docs.python.org/library/difflib.html#difflib.unified_diff)。 [这些格式](http://en.wikipedia.org/wiki/Diff#Unified_format)'@@ -l,s + l,s @@'给你删除的行数,起始行,行数补充,起跑线。 – 2012-02-29 21:06:13

+0

是的,顺序很重要,基本上difflib已经实现了智能化diff'ing,只是不是行号部分 – 2012-02-29 21:06:35

回答

11

difflib可以给你所需要的。假设:

A.TXT

this 
is 
a 
bunch 
of 
lines 

b.txt

this 
is 
a 
different 
bunch 
of 
other 
lines 

这样的代码:

import difflib 

fileA = open("a.txt", "rt").readlines() 
fileB = open("b.txt", "rt").readlines() 

d = difflib.Differ() 
diffs = d.compare(fileA, fileB) 
lineNum = 0 

for line in diffs: 
    # split off the code 
    code = line[:2] 
    # if the line is in both files or just b, increment the line number. 
    if code in (" ", "+ "): 
     lineNum += 1 
    # if this line is only in b, print the line number and the text on the line 
    if code == "+ ": 
     print "%d: %s" % (lineNum, line[2:].strip()) 

给出了类似的输出:

[email protected] ~/temp:python diffy.py 
4: different 
7: other 

您还需要查看difflib代码"? "并查看您希望如何处理该问题。

(另外,在实际的代码,你想使用上下文管理器,以确保文件被关闭,等等等等)

+0

谢谢!顺便说一句,这是基于1的,所以要从fileB获得修改后的行,它是lineNum-1 – 2012-02-29 21:37:17

+0

是的,它应该能够正确地以1为基础工作。它在打印之前递增。对? – bgporter 2012-02-29 21:43:03

1

一个穷人的解决方案:

with open('A.txt') as f: 
    linesA = f.readlines() 

with open('B.txt') as f: 
    linesB = f.readlines() 

print [k for k, v in enumerate(linesB) if not v in linesA] 
+0

它具有二次运行时间,并且不考虑行的顺序。想象一下A的行是'1','2'和'3',B的行是'1','2','3','2' - 你的代码不会产生任何输出。另外请注意,在A中询问行* *而不是*的问题。 – 2012-02-29 20:19:32

+0

请求不在A中的行,纠正了该问题。是的,运行时相当糟糕,因此也是穷人的解决方案。是的,这也是一个很好的观点,这个代码不尊重行的顺序。 – 2012-02-29 20:22:53