用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进行验证码识别的一些想法
Jan 25 Python
Python文件的读写和异常代码示例
Oct 31 Python
Python selenium抓取虎牙短视频代码实例
Mar 02 Python
keras 如何保存最佳的训练模型
May 25 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 Python
使用tensorflow进行音乐类型的分类
Aug 14 Python
python如何快速拼接字符串
Oct 28 Python
python中time.ctime()实例用法
Feb 03 Python
Python Spyder 调出缩进对齐线的操作
Feb 26 Python
python 提取html文本的方法
May 20 Python
Python selenium的这三种等待方式一定要会!
Jun 10 Python
全网非常详细的pytest配置文件
Jul 15 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的ddos攻击解决方法
2015/01/08 PHP
PHP7常量数组用法分析
2016/09/26 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
用js实现计算加载页面所用的时间
2010/04/02 Javascript
js导航菜单(自写)简单大方
2013/03/28 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
Python实现修改IE注册表功能示例
2018/05/10 Python
简单谈谈python基本数据类型
2018/09/26 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
《天安门广场》教学反思
2014/04/23 职场文书
校园文明倡议书
2014/05/16 职场文书
英语教育专业自荐信
2014/05/29 职场文书
计算机网络专业求职信
2014/06/05 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技