- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章用python标准库difflib比较两份文件的异同详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
【需求背景】 。
有时候我们要对比两份配置文件是不是一样,或者比较两个文本是否异样,可以使用linux命令行工具diff a_file b_file,但是输出的结果读起来不是很友好。这时候使用python的标准库difflib就能满足我们的需求.
下面这个脚本使用了difflib和argparse,argparse用于解析我们给此脚本传入的两个参数(即两份待比较的文件),由difflib执行比较,比较的结果放到了一个html里面,只要找个浏览器打开此html文件,就能直观地看到比较结果,两份文件有差异的地方会高亮显示出来.
【程序正文】 。
以python2.7为例,compare_two_files.py程序正文:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#!/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)
|
【待比较的文件】 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
两份文件分别是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比较两份文件的异同详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/qq_31598113/article/details/80153000 。
最后此篇关于用python标准库difflib比较两份文件的异同详解的文章就讲到这里了,如果你想了解更多关于用python标准库difflib比较两份文件的异同详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!