给定两个文本文件A,B,获取B中行数不在A中的简单方法是什么?我看到有difflib,却看不到一个接口,用于检索行号获取已更改的行数
获取已更改的行数
回答
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代码"? "
并查看您希望如何处理该问题。
(另外,在实际的代码,你想使用上下文管理器,以确保文件被关闭,等等等等)
谢谢!顺便说一句,这是基于1的,所以要从fileB获得修改后的行,它是lineNum-1 – 2012-02-29 21:37:17
是的,它应该能够正确地以1为基础工作。它在打印之前递增。对? – bgporter 2012-02-29 21:43:03
一个穷人的解决方案:
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]
它具有二次运行时间,并且不考虑行的顺序。想象一下A的行是'1','2'和'3',B的行是'1','2','3','2' - 你的代码不会产生任何输出。另外请注意,在A中询问行* *而不是*的问题。 – 2012-02-29 20:19:32
请求不在A中的行,纠正了该问题。是的,运行时相当糟糕,因此也是穷人的解决方案。是的,这也是一个很好的观点,这个代码不尊重行的顺序。 – 2012-02-29 20:22:53
- 1. 获取已更改
- 2. R获取已更新的行数
- 3. 仅获取已更改的文件
- 4. 获取ContentObserver中已更改的内容
- 5. 从DocumentListener获取已更改的文本
- 6. Hibernate Envers - 获取已更改的字段
- 7. 获取更改的行jtextarea
- 8. 获取选择选项值已更改的行的列的值
- 9. 如何获取数据库中已更改的数据?
- 10. Linq to SQL:获取已更改行的旧值
- 11. Visual Source Safe:获取特定行已更改的版本
- 12. Android - 在CheckBox上获取相关的ListView行已更改
- 13. 更改UIButton图像获取按钮位置已更改
- 14. 数据服务获取实体(EF 4.0)已更改属性
- 15. ORM获取已加入的表行数
- 16. 从Difference.DiffFiles获取更改的行C#
- 17. 获取在repeater中更改的行
- 18. PL/SQL - 不更新已更改的行
- 19. ReadEntityBody已更改行为
- 20. 获取EF上下文已更改错误后更新站点
- 21. ReactiveKit:如何获取ObservableCollection的已更改条目的值?
- 22. 获取WPF资源中已更改的DataContext的通知
- 23. 在Java Swing中获取已更改的JTextField的值
- 24. 从列表中的ItemRenderer中获取已更改的值
- 25. 获取已更改的复选框的值
- 26. 从TeamCity的REST API获取已更改文件的操作
- 27. 获取更改后的数据选择
- 28. 获取更新行数
- 29. Backbone.js的更改模型的URL参数,并获取不更新数据获取
- 30. 更改网址,以获取行动
你只是寻找文件B不在一个系?线的顺序是否重要? – 2012-02-29 20:08:21
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
是的,顺序很重要,基本上difflib已经实现了智能化diff'ing,只是不是行号部分 – 2012-02-29 21:06:35