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代码

 root@kali:/mnt/disk/python/difflib# cat difflib_0.py

 #!/usr/bin/env python

 import difflib

 text1 = '''

 I love HaiYan

 I very love HaiYan

 She's the one I love the most.

 '''

 text2 = '''

 I love LiWang

 I very love LiWang

 I'm his favorite person.

 '''

 d = difflib.Differ()

 print (list(d.compare(text1,text2)))

 

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']

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

增加代码:

 list1 = list(d.compare(text1,text2))

 for line in list1:

     if line == "\n":

         print ("\n")

     print ("%s" %(line),end='')

执行代码:

# 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 向文件写入内容

 # echo -e "I love HaiYan \nI very love HaiYan \nShe's the one I love the most." > test_1

 # echo -e "I love LiWang \nI very love LiWang \nI'm his favorite person" > test_2

2.2.2 编写python代码

 # cat  difflib_1.py

 #!/usr/bin/env python

 import difflib

 def open_files(filename):

    files = open(filename,'rb')

    text = files.read().splitlines()

    files.close()

    return text

 d = difflib.HtmlDiff()

 text_1 = open_files('test_1')

 text_2 = open_files('test_2')

 print (d.make_file(text_1,text_2))

2.2.3 执行脚本,用网页打开

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

 

3.difflib案例

3.1 需求

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

3.2 流程图

流程图:

3.3 代码编写:

 #cat difflib_2.py

 #!/usr/bin/env python

 #exit argv

 import sys

 #path

 import os

 #HtmlDiff

 import difflib

 html_files = '/mnt/disk/html/index.html'

 #Determine whether the parameter exists

 try:

     script_name = sys.argv[0]

     file1 = sys.argv[1]

     file2 = sys.argv[2]

 except:

     print ("%s Using: %s filename1 filename 2" %(script_name,script_name))

     sys.exit()

 #Function 1

 def dealwith_files(filename):

     #open files

     try:

         files = open(filename,'rb')

         #read files

         text = files.read().splitlines()

         #close files

         files.close()

     except:

         print ("Open files fail ")

         sys.exit()

     #return files

     return text

 #Determine if the files exists

 if os.path.isfile(file1) and os.path.isfile(file2):

     d = difflib.HtmlDiff()

     try:

         print_files = open(html_files,'w')

         print_files.write(d.make_file(dealwith_files(file1),dealwith_files(file2)))

         print_files.close()

     except:

         print ("write %s fail" %(html_files))

 #    print (d.make_file(dealwith_files(file1),dealwith_files(file2)))

 else:

     print ("%s or %s is not such file" %(file1,file2))

 sys.exit()

3.4 执行脚本输出

 #  difflib_2.py

 # ./difflib_2.py debconf.conf debconf.conf.bak

 #

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

3.5 效果

刷新网页

Python 之 Difflib的更多相关文章

  1. python利用difflib判断两个字符串的相似度

    我们再工作中可能会遇到需要判断两个字符串有多少相似度的情况(比如抓取页面内容存入数据库,如果相似度大于70%则判定为同一片文章,则不录入数据库) 那这个时候,我们应该怎么判断呢? 不要着急,pytho ...

  2. 使用Python自带difflib模块进行文件内容差异对比

    difflib_text.py #!/usr/bin/python import difflib import sys try: textfile1=sys.argv[1] textfile2=sys ...

  3. Python Thrift 简单示例

    本文基于Thrift-0.10,使用Python实现服务器端,使用Java实现客户端,演示了Thrift RPC调用示例.Java客户端提供两个字符串参数,Python服务器端计算这两个字符串的相似度 ...

  4. 使用python比较两个文件的不同之处

    比较两个文件的不同之处用处还是比较大的,特别是比较两个版本的不同之处 [root@localhost python]# cat diftest.py #!/usr/bin/python import ...

  5. python开发_difflib字符串比较

    在python的difflib中 HtmlDiff:比较后以html方法展示 我们比较的是字符串: 'hello world!' 和 'hElLO Wor2d!' 具体代码: from difflib ...

  6. Python比较配置文件

    工作中最常见的配置文件有四种:普通key=value的配置文件.Json格式的配置文件.HTML格式的配置文件以及YAML配置文件. 这其中以第一种居多,后三种在成熟的开源产品中较为常见,本文只针对第 ...

  7. 你可能不知道的 Python 技巧

    英文 | Python Tips and Trick, You Haven't Already Seen 原作 | Martin Heinz (https://martinheinz.dev) 译者 ...

  8. difflib模块详解

    1.两个字符串对比 import difflib text1=""" test1 #定义字符串 hellow my name is machanwei! difflib ...

  9. 对比Nginx配置文件差异

    一.概要: Python2 官方文档:https://docs.python.org/2/library/difflib.html Python2 官方文档:https://docs.python.o ...

随机推荐

  1. 成为JAVA架构师必看书籍推荐

    原创文章 “学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书 ...

  2. Redhat(RHEL)配置静态IP

    vim /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=itcc.dev GATEWAY=192.168.0.1 v ...

  3. Dom,pull,Sax解析XML

    本篇随笔将详细讲解如何在Android当中解析服务器端传过来的XML数据,这里将会介绍解析xml数据格式的三种方式,分别是DOM.SAX以及PULL. 一.DOM解析XML 我们首先来看看DOM(Do ...

  4. javascript 字面量 和变量 之间的关系

    https://www.w3cschool.cn/javascript/js-syntax.html

  5. 基于Confluent.Kafka实现的KafkaConsumer消费者类和KafkaProducer消息生产者类型

    一.引言 研究Kafka有一段时间了,略有心得,基于此自己就写了一个Kafka的消费者的类和Kafka消息生产者的类,进行了单元测试和生产环境的测试,还是挺可靠的. 二.源码 话不多说,直接上代码,代 ...

  6. msysgit解决中文乱码问题

    项目中在用git,安装msysgit客户端后处理中文是有问题的: ls中文目录/文件名乱码:提交中文的log,push到服务器上会乱码:git log查看服务器pull过来的log乱码. 1.ls命令 ...

  7. linux 管道符与通配符

    ###管道符 *命令格: 命令1 | 命令2 //命令1的正确输出作为命令2的操作对象 ll | more netstat -an | grep xxx 通配符 类似于正则表达式 ? 一个以上 [] ...

  8. svn冲突问题解决办法

    经常有人会说,树冲突是很难解决的一类冲突,其实一旦了解了其原理,要解决也不难.先回顾下对于树冲突的定义.     树冲突:当一名开发人员移动.重命名.删除一个文件或文件夹,而另一名开发人员也对它们进行 ...

  9. spec文件写作规范

    spec文件写作规范 2008-09-28 11:52:17 分类: LINUX 1.The RPM system assumes five RPM directories BUILD:rpmbuil ...

  10. mongo数据库的y2038问题

    查阅mongo for c driver 驱动源码, 发现其 _id 是 12byte  ,其中头4字节,调用time(NULL), 这个函数存在y2038问题. 建议是修改为16byte ,前面8b ...