Python 之 Difflib

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 之 Difflib相关的知识,希望对你有一定的参考价值。

Python 之 Difflib

2017年7月8日

word文档地址:https://wenku.baidu.com/view/36692440854769eae009581b6bd97f192379bf57

参考书籍:《Python自动化运维 ——技术与最佳实践》 作者:李天斯

1.什么是difflib

Difflib作为python的标准库,无需安装,作用是对比文本之间的差异,而且支持输出可读性比较强的HTML文档,与Linux下的vimdiff命令类似,我们可以比对文本、配置文件之间的差异,在版本控制方面非常有用。

2.difflib的简单使用

2.1 Differ的简单使用

2.1.1 编写python代码

技术分享
 1 [email protected]:/mnt/disk/python/difflib# cat difflib_0.py
 2 
 3 #!/usr/bin/env python
 4 
 5 import difflib
 6 
 7 
 8 text1 = ‘‘‘
 9 
10 I love HaiYan
11 
12 I very love HaiYan
13 
14 She‘s the one I love the most.
15 
16 ‘‘‘
17 
18 text2 = ‘‘‘
19 
20 I love LiWang
21 
22 I very love LiWang
23 
24 I‘m his favorite person.
25 
26 ‘‘‘
27 
28 d = difflib.Differ()
29 
30 print (list(d.compare(text1,text2)))
View Code

 

 

2.1.2 执行脚本输出

# python difflib_0.py

[  \\n,   I,    ,   l,   o,   v,   e,    , + L, - H, - a,   i, - Y, + W,   a,   n, + g,   \\n,   I,    ,   v,   e,   r,   y,    ,   l,   o,   v,   e,    , + L, - H, - a,   i, - Y, + W,   a,   n, + g,   \\n, - S, + I, "+ ‘", + m, +  ,   h, + i, - e, "- ‘",   s,    , + f, + a, + v, + o, + r, + i,   t, - h,   e,    , + p, + e, + r, + s,   o,   n, - e, -  , - I, -  , - l, - o, - v, - e, -  , - t, - h, - e, -  , - m, - o, - s, - t,   .,   \\n]

 

输出了看不懂的列表,打印列表后再进行查看

增加代码:

技术分享
1 list1 = list(d.compare(text1,text2))
2 
3 for line in list1:
4 
5     if line == "\\n":
6 
7         print ("\\n")
8 
9     print ("%s" %(line),end=‘‘)
View Code

 

 

执行代码:

# python3 difflib_0.py   

  I     l  o  v  e   + L- H- a  i- Y+ W  a  n+ g  

  I     v  e  r  y     l  o  v  e   + L- H- a  i- Y+ W  a  n+ g  

- S+ I+ + m+    h+ i- e-   s   + f+ a+ v+ o+ r+ i  t- h  e   + p+ e+ r+ s  o  n- e-  - I-  - l- o- v- e-  - t- h- e-  - m- o- s- t  .

 

  

符号含义:

+:包含在第一个序列中,但不包含第二个序列

-:包含在第二个序列中,但是不包含第一个序列

 

2.2 HtmlDiff的简单使用

2.2.1 向文件写入内容

1 # echo -e "I love HaiYan \\nI very love HaiYan \\nShe‘s the one I love the most." > test_1
2 
3 # echo -e "I love LiWang \\nI very love LiWang \\nI‘m his favorite person" > test_2

 

 

2.2.2 编写python代码

技术分享
 1 # cat  difflib_1.py
 2 
 3 #!/usr/bin/env python
 4 
 5 import difflib
 6 
 7 def open_files(filename):
 8 
 9    files = open(filename,rb)
10 
11    text = files.read().splitlines()
12 
13    files.close()
14 
15    return text
16 
17 d = difflib.HtmlDiff()
18 
19  
20 text_1 = open_files(test_1)
21 
22 text_2 = open_files(test_2)
23 
24 print (d.make_file(text_1,text_2))
View Code

 

 

2.2.3 执行脚本,用网页打开

1 # python difflib_1.py > /mnt/disk/html/index.html

 

 技术分享

3.difflib案例

3.1 需求

需求:利用python实现一个功能,只需要执行[python脚本名称 文件1 文件2],只需要打开浏览器输入网址就能够看见文件比对效果

 

3.2 流程图

流程图:

 技术分享

 

3.3 代码编写:

技术分享
 1 #cat difflib_2.py
 2 
 3 #!/usr/bin/env python
 4 
 5 #exit argv
 6 
 7 import sys
 8 
 9 #path
10 
11 import os
12 
13 #HtmlDiff
14 
15 import difflib
16 
17 html_files = /mnt/disk/html/index.html
18 
19 #Determine whether the parameter exists
20 
21 try:
22 
23     script_name = sys.argv[0]
24 
25     file1 = sys.argv[1]
26 
27     file2 = sys.argv[2]
28 
29 except:
30 
31     print ("%s Using: %s filename1 filename 2" %(script_name,script_name))
32 
33     sys.exit()
34 
35 #Function 1
36 
37 def dealwith_files(filename):
38 
39     #open files
40 
41     try:
42 
43         files = open(filename,rb)
44 
45         #read files
46 
47         text = files.read().splitlines()
48 
49         #close files
50 
51         files.close()
52 
53     except:
54 
55         print ("Open files fail ")
56 
57         sys.exit()
58 
59     #return files
60 
61     return text
62 
63 #Determine if the files exists
64 
65 if os.path.isfile(file1) and os.path.isfile(file2):
66 
67     d = difflib.HtmlDiff()
68 
69     try:
70 
71         print_files = open(html_files,w)
72 
73         print_files.write(d.make_file(dealwith_files(file1),dealwith_files(file2)))
74 
75         print_files.close()
76 
77     except:
78 
79         print ("write %s fail" %(html_files))
80 
81 #    print (d.make_file(dealwith_files(file1),dealwith_files(file2)))
82 
83 else:
84 
85     print ("%s or %s is not such file" %(file1,file2))
86 
87 sys.exit()
View Code

 

 

3.4 执行脚本输出

1 # chmod 755 difflib_2.py
2 
3 # ./difflib_2.py debconf.conf debconf.conf.bak
4 
5 #

 

 

chmod 是赋予脚本执行权限,执行difflib_2py 参数为debconf.conf debconf.conf.bak,没有任何输出,则证明执行OK

 

3.5 效果

刷新网页

技术分享

 

以上是关于Python 之 Difflib的主要内容,如果未能解决你的问题,请参考以下文章

python运维开发常用模块文件对比模块difflib

Python比较文件差异,difflib类库的使用

python中的difflib

python中的difflib

python difflib.md

Python一起来找茬—difflib模块