給定兩個文本文件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. R獲取已更新的行數
- 2. 從DocumentListener獲取已更改的文本
- 3. 僅獲取已更改的文件
- 4. 獲取更改的行jtextarea
- 5. 獲取選擇選項值已更改的行的列的值
- 6. Linq to SQL:獲取已更改行的舊值
- 7. Android - 在CheckBox上獲取相關的ListView行已更改
- 8. Visual Source Safe:獲取特定行已更改的版本
- 9. ORM獲取已加入的錶行數
- 10. 從Difference.DiffFiles獲取更改的行C#
- 11. 獲取在repeater中更改的行
- 12. PL/SQL - 不更新已更改的行
- 13. 獲取WPF資源中已更改的DataContext的通知
- 14. CKEditor - 獲取已更改的內容和周圍的HTML標籤
- 15. ReactiveKit:如何獲取ObservableCollection的已更改條目的值?
- 16. 獲取已更改的複選框的值
- 17. Backbone.js的更改模型的URL參數,並獲取不更新數據獲取
- 18. Mac OS X:獲取已更改/寫入文件的名稱
- 19. 在Excel中獲取svn中已更改文件的列表
- 20. Mercurial:從修訂版獲取已更改的文件?
- 21. 如何獲取Google Drive上已更改文件的ID
- 22. 從JGit中提交獲取已更改文件的列表
- 23. 如何獲取已更改輸入的屬性?
- 24. 獲取已更改的進程FileInfo.lastAccessTime或FileInfo.lastWriteTime
- 25. Ruby on Rails - 如何在after_filter中獲取已更改的對象?
- 26. 如何使用nant從TFS獲取已更改的文件
- 27. 如何獲取angularjs中已更改的對象?
- 28. 如何獲取已更改輸入的屬性值?
- 29. 如何獲取svn中已更改文件的列表?
- 30. 從NHibernate會話中獲取已更改的實體
你只是尋找文件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