用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判断变量是否已经定义的方法
Aug 18 Python
python基础教程之面向对象的一些概念
Aug 29 Python
总结python爬虫抓站的实用技巧
Aug 09 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
python深度优先搜索和广度优先搜索
Feb 07 Python
python3 图片referer防盗链的实现方法
Mar 12 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
Nov 30 Python
Django Python 获取请求头信息Content-Range的方法
Aug 06 Python
python使用rsa非对称加密过程解析
Dec 28 Python
python3操作注册表的方法(Url protocol)
Feb 05 Python
什么是python类属性
Jun 10 Python
PyTorch 实现L2正则化以及Dropout的操作
May 27 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多层数组与对象的转换实例代码
2013/08/05 PHP
php获取操作系统语言代码
2013/11/04 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
JavaScript 动态将数字金额转化为中文大写金额
2009/05/14 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
2015/10/24 Javascript
Json解析的方法小结
2016/06/22 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
基于Vue生产环境部署详解
2017/09/15 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
pycharm 配置远程解释器的方法
2018/10/28 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
业务助理岗位职责
2013/11/18 职场文书
选秀节目策划方案
2014/06/06 职场文书
借款协议书
2014/09/16 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
教师节主题班会教案
2015/08/17 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电