用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的web.py框架下的application.py模块
May 02 Python
Python中subprocess的简单使用示例
Jul 28 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
Mar 13 Python
对Python中gensim库word2vec的使用详解
May 08 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
python如何保存文本文件
Jun 07 Python
详解python 内存优化
Aug 17 Python
python操作redis数据库的三种方法
Sep 10 Python
Python 解析xml文件的示例
Sep 29 Python
openstack中的rpc远程调用的方法
Jul 09 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
js DOM的学习笔记
2011/12/22 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
JavaScript基础心法 数据类型
2018/03/05 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
python根据距离和时长计算配速示例
2014/02/16 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
Python hashlib模块实例使用详解
2019/12/24 Python
python默认参数调用方法解析
2020/02/09 Python
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
物流经理自我评价
2013/09/23 职场文书
职高毕业生自我鉴定
2013/10/21 职场文书
最新的互联网创业计划书
2014/01/10 职场文书
体操比赛口号
2014/06/10 职场文书
倡导文明标语
2014/06/16 职场文书
房地产销售助理岗位职责
2015/04/14 职场文书
追悼词范文大全
2015/06/23 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis