用python标准库difflib比较两份文件的异同详解

【需求背景】

有时候我们要对比两份配置文件是不是一样,或者比较两个文本是否异样,可以使用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

再把运行结果产生的html文件下载到本地,用任一种浏览器打开即可,如截图:

运行结果:

使用浏览器查看html文件,可以看到,里面给出了各种颜色标注的图例说明,一目了然。

以上这篇用python标准库difflib比较两份文件的异同详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python备份目录及目录下的全部内容的实现方法

    本来是想写一个东西可以直接调用TortoiseSVN保存当前代码到一个分枝下的. 可惜调用SVN的部分还在研究.就先写了目录拷贝的部分. 如果有喜欢研究Python的童鞋愿意提供想法或者建议的话, 这里先谢谢了. :) 就目录拷贝的部分,思想很简单.读配置文件中的配置信息. 生成一个项目名称加日期时间组成的文件夹名为分枝名称.把当前项目下的全部内容 拷贝到这个目录下. 然后要做的研究就是调用TortoiseSVN命令嵌入这部分代码. 现在看代码: 1. 读取配置文件 配置文件很简单.用的就是tx

  • Python实现比较两个文件夹中代码变化的方法

    本文实例讲述了Python实现比较两个文件夹中代码变化的方法.分享给大家供大家参考.具体如下: 这里将修改代码后的目录与原始目录做对比,罗列出新增的代码文件,以及修改过的代码文件 # -*- coding: utf-8 -*- import os; folderA = "F:\\Projects\\FreeImageV3_14_1\\".lower(); folderB = u"E:\\Software\\图像解码库\\FreeImage3141\\FreeImage\\&q

  • Python实现定期检查源目录与备份目录的差异并进行备份功能示例

    本文实例讲述了Python实现定期检查源目录与备份目录的差异并进行备份功能.分享给大家供大家参考,具体如下: 在项目中,经常要更新文件,在更新之前首先要备份源文件,所以就用到了这个脚本(来自于Python自动化运维这本书),总共有以下几个步骤: 1. 获取要进行比较的两个目录,进行差异比较,把源目录特有的文件或目录.以及和备份目录不同的文件或目录保存到列表中,并且判断目录下面是否还有目录,递归进行保存这些差异文件. 2. 将差异文件列表中文件或目录的路径换成对应的备份路径,进行判断,如果备份路径

  • Python实现备份文件实例

    本文实例讲述了Python实现备份文件的方法,是一个非常实用的技巧.分享给大家供大家参考.具体方法如下: 该实例主要实现读取一个任务文件, 根据指定的任务参数自动备份. 任务文件的格式: (注意,分号后面注释是不支持的) [task] ; 一项任务开始 dir=h:/Project ; 指定备份的目录 recusive=1 ; 是否递归子目录 suffix=h|cpp|hpp|c|user|filters|vcxproj|sln|css|gif|html|bmp|png|lib|dsw|dsp|

  • 通过Python模块filecmp 对文件比较的实现方法

    filecmp定义了两个函数,用于方便地比较文件与文件夹:     filecmp.cmp(f1, f2[, shallow]): 比较两个文件的内容是否匹配.参数f1, f2指定要比较的文件的路径.可选参数shallow指定比较文件时是否需要考虑文件本身的属性(通过   os.stat函数可以获得文件属性).如果文件内容匹配,函数返回True,否则返回False, import filecmp s = filecmp.cmp("qin.txt", "jian.txt&quo

  • Python 比较文本相似性的方法(difflib,Levenshtein)

    最近工作需要用到序列匹配,检测相似性,不过有点复杂的是输入长度是不固定的,举例为: input_and_output = [1, 2, '你好', 世界', 12.34, 45.6, -21, '中国', '美丽'] 其中,需要从input_and_output 中选取不固定长度的一段作为输入,且顺序不定,然后去与总体进行比较,找出最符合的,开始是对汉字进行数值化编码,不过后来由于出现汉字越来越多,遂放弃该方法,转向别的方式,查找资料发现了两个python包广被推荐,从下面来看各有优缺点,记录之

  • Python实现配置文件备份的方法

    本文实例讲述了Python实现配置文件备份的方法.分享给大家供大家参考.具体如下: 这里平台为Linux: #!/usr/bin/python #Author:gdlinjianying@qq.com import os import time source = ['/etc/sysconfig/network-scripts', '/etc/sysconfig/network', '/etc/resolv.conf'] target_dir = '/opt/' target = target_

  • Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法

    本文实例讲述了Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法.分享给大家供大家参考.具体如下: 这个东东本来是做来给公司数据同步用的:新服务器还没正式启用,旧的服务器还在使用,每天都有大量图片传到旧服务器上面,为了避免备份全部图片,所以写了这么个工具. 1. 运行效果如下图所示: 2. Python代码如下: 复制代码 代码如下: # coding=gbk ''' Created on 2011-1-7 @author: HH ''' import os,ConfigParse

  • python实现备份目录的方法

    本文实例讲述了python实现备份目录的方法.分享给大家供大家参考.具体如下: 备份脚本1: #!/usr/bin/python # Filename: backup_ver1.py import os import time # 1. The files and directories to be backed up are specified in a list. source = ['/home/swaroop/byte', '/home/swaroop/bin'] # If you ar

  • python实现比较文件内容异同

    本文实例为大家分享了python实现比较文件内容异同的具体代码,供大家参考,具体内容如下 import sys import difflib import time import os """ 创作时间:2017-10-08 23:30 09 版本: 1.0.0 """ def main(): """主函数""" try: f1 = sys.argv[1]#获取文件名 f2 = sys.

随机推荐