热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python之Difflib

Python之Difflib2017年7月8日word文档地址:https:wenku.baidu.comview36692440854769eae009581b6bd97f192

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 root@kali:/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


推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
author-avatar
ao吖浩_257
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有