用python标准库difflib比较两份文件的异同详解


Posted in Python onNovember 16, 2018

【需求背景】

有时候我们要对比两份配置文件是不是一样,或者比较两个文本是否异样,可以使用linux命令行工具diff a_file b_file,但是输出的结果读起来不是很友好。这时候使用python的标准库difflib就能满足我们的需求。

下面这个脚本使用了difflib和argparse,argparse用于解析我们给此脚本传入的两个参数(即两份待比较的文件),由difflib执行比较,比较的结果放到了一个html里面,只要找个浏览器打开此html文件,就能直观地看到比较结果,两份文件有差异的地方会高亮显示出来。

【程序正文】

以python2.7为例,compare_two_files.py程序正文:

#!/bin/env python
# -*- coding: utf-8 -*-

# 20180430

import difflib
import sys
import argparse


# 读取建表语句或配置文件
def read_file(file_name):
 try:
  file_desc = open(file_name, 'r')
  # 读取后按行分割
  text = file_desc.read().splitlines()
  file_desc.close()
  return text
 except IOError as error:
  print 'Read input file Error: {0}'.format(error)
  sys.exit()


# 比较两个文件并把结果生成一份html文本
def compare_file(file1, file2):
 if file1 == "" or file2 == "":
  print '文件路径不能为空:第一个文件的路径:{0}, 第二个文件的路径:{1} .'.format(file1, file2)
  sys.exit()
 else:
  print "正在比较文件{0} 和 {1}".format(file1, file2)
 text1_lines = read_file(file1)
 text2_lines = read_file(file2)
 diff = difflib.HtmlDiff() # 创建HtmlDiff 对象
 result = diff.make_file(text1_lines, text2_lines) # 通过make_file 方法输出 html 格式的对比结果
 # 将结果写入到result_comparation.html文件中
 try:
  with open('result_comparation.html', 'w') as result_file:
   result_file.write(result)
   print "0==}==========> Successfully Finished\n"
 except IOError as error:
  print '写入html文件错误:{0}'.format(error)


if __name__ == "__main__":
 # To define two arguments should be passed in, and usage: -f1 fname1 -f2 fname2
 my_parser = argparse.ArgumentParser(description="传入两个文件参数")
 my_parser.add_argument('-f1', action='store', dest='fname1', required=True)
 my_parser.add_argument('-f2', action='store', dest='fname2', required=True)
 # retrieve all input arguments
 given_args = my_parser.parse_args()
 file1 = given_args.fname1
 file2 = given_args.fname2
 compare_file(file1, file2)

【待比较的文件】

两份文件分别是old_ddl_file和new_ddl_file,内容分别是—— 
old_ddl_file文件内容 
CREATE EXTERNAL TABLE raw_tags( 
p0 string COMMENT ‘uid', 
p3 string COMMENT ‘tag name, e.g. news, games, fairs, shoopingURL', 
p4 string COMMENT ‘e.g. 0, Games', 
p11 int COMMENT ‘gender', 
dt string COMMENT ‘date, like 26/6/2017', 
action string COMMENT ‘clickmodule, click_taghead_link, clicklink') 
CLUSTERED BY ( 
dt) 
INTO 4 BUCKETS 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ‘,' 
STORED AS INPUTFORMAT 
‘org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
LOCATION 
‘hdfs://hdfs-ha/apps/hive/warehouse/ksai.db/raw_tags' 
TBLPROPERTIES ( 
‘numFiles'='1', 
‘numRows'='0', 
‘rawDataSize'='0', 
‘totalSize'='70575510', 
‘transient_lastDdlTime'='1500469448')

new_ddl_file文件内容 
CREATE EXTERNAL TABLE raw_tags( 
p0 string COMMENT ‘uid', 
p3 string COMMENT ‘tag name, e.g. news, games, fairs, shoopingURL', 
p4 string COMMENT ‘e.g. 0, Games', 
p11 int COMMENT ‘gender', 
dt string COMMENT ‘date, like 26/6/2017', 
action string COMMENT ‘clickmodule, click_taghead_link, clicklink') 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ‘,' 
STORED AS INPUTFORMAT 
‘org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
LOCATION 
‘hdfs://hdfs-ha/apps/hive/warehouse/ksai.db/raw_tags' 
TBLPROPERTIES ( 
‘COLUMN_STATS_ACCURATE'='{\”BASIC_STATS\”:\”true\”}', 
‘numFiles'='0', 
‘numRows'='0', 
‘rawDataSize'='0', 
‘totalSize'='0', 
‘transient_lastDdlTime'='1521546069')

肉眼很难看出来区别吧?

【执行结果】

那么就使用上面的脚本来比较,在linux命令行的使用方法 python -f1 file1 -f2 file2 也就是:

python compare_two_files.py -f1 old_ddl_file -f2 new_ddl_file

用python标准库difflib比较两份文件的异同详解

再把运行结果产生的html文件下载到本地,用任一种浏览器打开即可,如截图:

用python标准库difflib比较两份文件的异同详解

运行结果:

用python标准库difflib比较两份文件的异同详解

使用浏览器查看html文件,可以看到,里面给出了各种颜色标注的图例说明,一目了然。

以上这篇用python标准库difflib比较两份文件的异同详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现堆排序的方法详解
May 03 Python
python3.5仿微软计算器程序
Mar 30 Python
Python 数据结构之堆栈实例代码
Jan 22 Python
使用Python制作微信跳一跳辅助
Jan 31 Python
Python操作MySQL数据库的方法
Jun 20 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
Sep 26 Python
Python pickle模块实现对象序列化
Nov 22 Python
python 遍历pd.Series的index和value
Nov 26 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
Sep 17 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
在Pandas中给多层索引降级的方法
Nov 16 #Python
Python 面试中 8 个必考问题
Nov 16 #Python
python 使用值来排序一个字典的方法
Nov 16 #Python
pandas通过索引进行排序的示例
Nov 16 #Python
在pandas多重索引multiIndex中选定指定索引的行方法
Nov 16 #Python
对Pandas MultiIndex(多重索引)详解
Nov 16 #Python
一百行python代码将图片转成字符画
Feb 19 #Python
You might like
PHP 字符串分割和比较
2009/10/06 PHP
PHP模块memcached使用指南
2014/12/08 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
php代码架构的八点注意事项
2016/01/25 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
用js实现随机返回数组的一个元素
2007/08/13 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
微信小程序的引导页实现代码
2020/06/24 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
利用python开发app实战的方法
2019/07/09 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
同学聚会策划方案
2014/06/06 职场文书
餐馆开业致辞
2015/08/01 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技