用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 07 Python
Python内置函数之filter map reduce介绍
Nov 30 Python
Python进程间通信用法实例
Jun 04 Python
Python实现Linux的find命令实例分享
Jun 04 Python
Python删除Java源文件中全部注释的实现方法
Aug 30 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
python版大富翁源代码分享
Nov 19 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
Python笔记之观察者模式
Nov 20 Python
Pytorch转onnx、torchscript方式
May 25 Python
多个版本的python共存时使用pip的正确做法
Oct 26 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 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
php导入导出excel实例
2013/10/25 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
javascript学习指南之回调问题
2016/04/23 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
django 自定义过滤器的实现
2019/02/26 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
python把转列表为集合的方法
2019/06/28 Python
基于python调用psutil模块过程解析
2019/12/20 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
大学生村官演讲稿
2014/04/25 职场文书
关爱残疾人标语
2014/06/25 职场文书
西安事变观后感
2015/06/12 职场文书
家电创业计划书
2019/08/05 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
浅谈Redis的几个过期策略
2021/05/27 Redis
python数字图像处理:图像简单滤波
2022/06/28 Python