用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展示动态规则法用以解决重叠子问题的示例
Apr 02 Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 Python
win与linux系统中python requests 安装
Dec 04 Python
python3中int(整型)的使用教程
Mar 23 Python
Python 多进程和数据传递的理解
Oct 09 Python
python将回车作为输入内容的实例
Jun 23 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
pandas通过索引进行排序的示例
Nov 16 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
解决Djang2.0.1中的reverse导入失败的问题
Aug 16 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
python 算法题——快乐数的多种解法
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
DISCUZ 分页代码
2007/01/02 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
jquery固定底网站底部菜单效果
2013/08/13 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
JavaScript canvas实现雨滴特效
2021/01/10 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
Python操作json数据的一个简单例子
2014/04/17 Python
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
python eventlet绿化和patch原理
2020/11/21 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
HTML5 UTF-8 中文乱码的解决方法
2013/11/18 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
土木工程毕业生推荐信
2013/10/28 职场文书
初一科学教学反思
2014/01/27 职场文书
学习普通话的体会
2014/11/07 职场文书
2014年党委工作总结
2014/11/22 职场文书
党员个人承诺书
2015/04/27 职场文书
nginx对http请求处理的各个阶段详析
2021/03/31 Servers