[英]Python difflib to compare two csv files and highlight the world level differences in HTML output
I am not an expertise in Python and I tried searching my best to find the answer, but couldn't find. 我不是Python方面的专业人士,因此我尽力寻找最佳答案,但是找不到。 Pardon me, If this is a duplicate question and point me in the right direction, if you can. 请原谅我,如果这是一个重复的问题,请告诉我正确的方向。
I am trying to compare two CSV files using Python Difflib and generating the Diff output as a HTML page. 我正在尝试使用Python Difflib比较两个CSV文件,并将Diff输出生成为HTML页面。 The current difflib module has the inbuilt options as -m to generate the HTML output of the two csv files side by side by highlighting the differences. 当前的difflib模块具有-m内置选项,可通过突出显示差异来并排生成两个csv文件的HTML输出。
However, the difflib uses difflib.SequenceMatcher
to find the differences and create a HTML file using difflib.HtmlDiff.make_file
. 但是,difflib使用difflib.SequenceMatcher
查找差异并使用difflib.HtmlDiff.make_file
创建HTML文件。 But, the output for that it produces is not that I want. 但是,它产生的输出不是我想要的。
The output I am getting currently from the difflib is : The Default Python DIFFLIB HTML output is Here. 我目前从difflib获得的输出是: 默认Python DIFFLIB HTML输出在这里。
However, The output I want is : I am looking for a word level highlight instead of the changes that are highlighted either at character level or a sequence highlight. 但是,我想要的输出是 :我正在寻找单词级别的突出显示,而不是字符级别或序列突出显示的更改。 I am looking to highlight the WHOLE WORD if any changed that happened between old file and new file. 如果旧文件与新文件之间发生任何更改,我希望突出显示整个单词 。
The changes that I want to highlight is: A word Level highlight of the text. 我要突出显示的更改是: 文本的单词级别突出显示。
Please help me in this regard, whether this is really possible with difflib or do I have to use any other tools/modules. 在这方面,请帮助我,无论difflib是否确实可行,还是我必须使用任何其他工具/模块。 I tried using vimdiff and other plugins, but I am left with nothing. 我尝试使用vimdiff和其他插件,但是一无所有。 I am open to any thing here. 我对这里的任何事情都开放。
The code I am using is from PythonDiffLib
docs page. 我使用的代码来自PythonDiffLib
docs页面。
import sys, os, time, difflib, optparse
def main():
..
..
..
n = options.lines //I used this n = ZERO.
fromfile, tofile = args # as specified in the usage string
# we're passing these as arguments to the diff function
fromdate = time.ctime(os.stat(fromfile).st_mtime)
todate = time.ctime(os.stat(tofile).st_mtime)
fromlines = open(fromfile, 'U').readlines()
tolines = open(tofile, 'U').readlines()
diff = difflib.HtmlDiff().make_file(fromlines, tolines, fromfile,
tofile, context=TRUE,
numlines=0)
# we're using writelines because diff is a generator
sys.stdout.writelines(diff)
` Old.csv ` Old.csv
refno,title,author,year,price
1001,CPP,MILTON,2008,456
1002,JAVA,Gilson,2002,456
1003,Adobe Flex,2010,566
1004,General Knowledge,Sinson,2007,465
1005,Actionscript,Gilto,2008,480
new.csv new.csv
refno,title,author,year,price
1001,CPP,MILTON,2010,456,2008
1002,JAVA,Gilson,2002
1003,Adobe Flexi,Johnson,2010,566
1004,General Knowledge,Simpson,2007,465
105,Action script,Gilto,2008,480
2000,Drama,DayoNe,,2020,560
I am also adding the Default HTML DIFF Output and Expected HTML DIFF output below. 我还在下面添加了“默认HTML DIFF输出”和“预期HTML DIFF输出”。
Default HTML DIFF Output from DIFFLIB: DIFFLIB的默认 HTML DIFF输出:
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-8859-1" />
<title></title>
<style type="text/css">
table.diff {font-family:Courier; border:medium;}
.diff_header {background-color:#e0e0e0}
td.diff_header {text-align:right}
.diff_next {background-color:#c0c0c0}
.diff_add {background-color:#aaffaa}
.diff_chg {background-color:#ffff77}
.diff_sub {background-color:#ffaaaa}
</style>
</head>
<body>
<table class="diff" id="difflib_chg_to0__top"
cellspacing="0" cellpadding="0" rules="groups" >
<colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>
<colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>
<thead><tr><th class="diff_next"><br /></th><th colspan="2" class="diff_header">old.csv</th><th class="diff_next"><br /></th><th colspan="2" class="diff_header">new.csv</th></tr></thead>
<tbody>
<tr><td class="diff_next" id="difflib_chg_to0__0"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="from0_2">2</td><td nowrap="nowrap">1001,CPP,MILTON,200<span class="diff_sub">8</span>,456</td><td class="diff_next"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="to0_2">2</td><td nowrap="nowrap">1001,CPP,MILTON,20<span class="diff_add">1</span>0,456<span class="diff_add">,2008</span></td></tr>
<tr><td class="diff_next"></td><td class="diff_header" id="from0_3">3</td><td nowrap="nowrap">1002,JAVA,Gilson,2002<span class="diff_sub">,456</span></td><td class="diff_next"></td><td class="diff_header" id="to0_3">3</td><td nowrap="nowrap">1002,JAVA,Gilson,2002</td></tr>
<tr><td class="diff_next"></td><td class="diff_header" id="from0_4">4</td><td nowrap="nowrap">1003,Adobe Flex,2010,566</td><td class="diff_next"></td><td class="diff_header" id="to0_4">4</td><td nowrap="nowrap">1003,Adobe Flex<span class="diff_add">i,Johnson</span>,2010,566</td></tr>
<tr><td class="diff_next"></td><td class="diff_header" id="from0_5">5</td><td nowrap="nowrap">1004,General Knowledge,Si<span class="diff_chg">n</span>son,2007,465</td><td class="diff_next"></td><td class="diff_header" id="to0_5">5</td><td nowrap="nowrap">1004,General Knowledge,Si<span class="diff_chg">mp</span>son,2007,465</td></tr>
<tr><td class="diff_next"></td><td class="diff_header" id="from0_6">6</td><td nowrap="nowrap">1<span class="diff_sub">0</span>05,Actionscript,Gilto,2008,480</td><td class="diff_next"></td><td class="diff_header" id="to0_6">6</td><td nowrap="nowrap">105,Action<span class="diff_add"> </span>script,Gilto,2008,480</td></tr>
<tr><td class="diff_next"></td><td class="diff_header"></td><td nowrap="nowrap"></td><td class="diff_next"></td><td class="diff_header" id="to0_7">7</td><td nowrap="nowrap"><span class="diff_add">2000,Drama,DayoNe,,2020,560</span></td></tr>
</tbody>
</table>
</body>
</html>
Expected HTML DIFF Output from DIFFLIB: 来自DIFFLIB的预期 HTML DIFF输出:
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-8859-1" />
<title></title>
<style type="text/css">
table.diff {font-family:Courier; border:medium;}
.diff_header {background-color:#e0e0e0}
td.diff_header {text-align:right}
.diff_next {background-color:#c0c0c0}
.diff_add {background-color:#aaffaa}
.diff_chg {background-color:#ffff77}
.diff_sub {background-color:#ffaaaa}
</style>
</head>
<body>
<table class="diff" id="difflib_chg_to0__top"
cellspacing="0" cellpadding="0" rules="groups" >
<colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>
<colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>
<thead><tr><th class="diff_next"><br /></th><th colspan="2" class="diff_header">old.csv</th><th class="diff_next"><br /></th><th colspan="2" class="diff_header">new.csv</th></tr></thead>
<tbody>
<tr><td class="diff_next" id="difflib_chg_to0__0"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="from0_2">2</td><td nowrap="nowrap">1001,CPP,MILTON,<span class="diff_sub">2008</span>,456</td><td class="diff_next"><a href="#difflib_chg_to0__top">t</a></td><td class="diff_header" id="to0_2">2</td><td nowrap="nowrap">1001,CPP,MILTON,<span class="diff_add">2010</span>,456<span class="diff_add">,2008</span></td></tr>
<tr><td class="diff_next"></td><td class="diff_header" id="from0_3">3</td><td nowrap="nowrap">1002,JAVA,Gilson,2002<span class="diff_sub">,456</span></td><td class="diff_next"></td><td class="diff_header" id="to0_3">3</td><td nowrap="nowrap">1002,JAVA,Gilson,2002</td></tr>
<tr><td class="diff_next"></td><td class="diff_header" id="from0_4">4</td><td nowrap="nowrap">1003,<span class="diff_sub">Adobe Flex</span>,2010,566</td><td class="diff_next"></td><td class="diff_header" id="to0_4">4</td><td nowrap="nowrap">1003,<span class="diff_add">Adobe Flexi</span>,<span class="diff_add">Johnson</span>,2010,566</td></tr>
<tr><td class="diff_next"></td><td class="diff_header" id="from0_5">5</td><td nowrap="nowrap">1004,General Knowledge,<span class="diff_sub">Sinson</span>,2007,465</td><td class="diff_next"></td><td class="diff_header" id="to0_5">5</td><td nowrap="nowrap">1004,General Knowledge,<span class="diff_add">Simpson</span>,2007,465</td></tr>
<tr><td class="diff_next"></td><td class="diff_header" id="from0_6">6</td><td nowrap="nowrap"><span class="diff_sub">1005</span>,<span class="diff_sub">Actionscript</span>,Gilto,2008,480</td><td class="diff_next"></td><td class="diff_header" id="to0_6">6</td><td nowrap="nowrap"><span class="diff_add">105</span>,<span class="diff_add">Action script</span>,Gilto,2008,480</td></tr>
<tr><td class="diff_next"></td><td class="diff_header"></td><td nowrap="nowrap"></td><td class="diff_next"></td><td class="diff_header" id="to0_7">7</td><td nowrap="nowrap"><span class="diff_add">2000,Drama,DayoNe,,2020,560</span></td></tr>
</tbody>
</table>
</body>
</html>
Question : I am looking for a word level highlight 问题 :我正在寻找单词级别的重点
Implements class Comma_HtmlDiff
, expand Highlight to Comma boundaries: 实现class Comma_HtmlDiff
,将Highlight扩展到Comma边界:
You have to Overload difflib.ndiff
. 您必须重载difflib.ndiff
。
Note : Only expand the first highlighted Part is implemented. 注意 :仅扩展第一个突出显示的部分。
Ifdifflib.ndiff
highlights across Comma, this is not corrected. 如果difflib.ndiff
跨逗号突出显示,则不会更正此错误。
class Comma_HtmlDiff(difflib.HtmlDiff):
def __init__(self, tabsize=8, wrapcolumn=None, linejunk=None,
charjunk=difflib.IS_CHARACTER_JUNK):
setattr(difflib, '_ndiff', difflib.ndiff)
setattr(difflib, 'ndiff', self.ndiff)
super().__init__(tabsize, wrapcolumn, linejunk, charjunk)
def ndiff(self, a, b, linejunk=None, charjunk=difflib.IS_CHARACTER_JUNK):
_line = ''
for line in difflib._ndiff(a, b, linejunk, charjunk):
if line.startswith('-'):
_d = '-'
_line = line
elif line.startswith('+'):
_d = '+'
_line = line
if line.startswith('?'):
dp = line.find(_d)
if dp == -1:
_d = '+'
dp = line.find('^')
dpl = _line.rfind(',', 0, dp)
if dpl == -1:
dpl = 2
else:
dpl += 1
dpr = _line.find(',', dp)
if dpr == dp:
_d = ' '
dpl = dp
dpr = dp+1
dpw = dpr - dpl
line = line[:dpl] + _d*dpw + line[dpr:]
yield line
# Usage
diff = Comma_HtmlDiff().make_file(fromlines, tolines, fromfile,
tofile, context=True,
numlines=0)
Tested with Python: 3.4.2 使用Python测试:3.4.2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.