Python difflib比较两个csv文件并突出显示HTML输出中的世界级差异

Python difflib比较两个csv文件并突出显示HTML输出中的世界级差异,python,difflib,Python,Difflib,我不是Python方面的专家,我尽全力寻找答案,但没有找到。请原谅,如果这是一个重复的问题,请尽可能为我指出正确的方向。 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 # w

我不是Python方面的专家,我尽全力寻找答案,但没有找到。请原谅,如果这是一个重复的问题,请尽可能为我指出正确的方向。

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)
我尝试使用Python Difflib比较两个CSV文件,并将Diff输出生成为HTML页面。当前的difflib模块具有内置选项-m,可以通过突出显示差异来并排生成两个csv文件的HTML输出

但是,difflib使用
difflib.SequenceMatcher
查找差异,并使用
difflib.HtmlDiff.make_文件创建HTML文件。但是,它产生的输出不是我想要的

我当前从difflib获得的输出是:

然而,我想要的输出是:我正在寻找单词级高亮显示,而不是字符级或序列高亮显示的更改。如果旧文件和新文件之间发生任何更改,我希望突出显示整个单词

我想强调的更改是:

请在这方面帮助我,这是否真的可以通过difflib实现,或者我是否必须使用任何其他工具/模块。我试着使用vimdiff和其他插件,但什么都没有。我对这里的任何事情都持开放态度

我使用的代码来自
pythondiflib
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

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
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
new.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
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
我还在下面添加默认的HTML差异输出和预期的HTML差异输出。

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)
默认值来自DIFFLIB的HTML差异输出:


table.diff{font-family:Courier;border:medium;}
.diff_标题{背景色:#e0}
td.diff_标题{文本对齐:右}
.diff_next{背景色:#C0}
.diff_添加{背景色:#aaffaa}
.diff_chg{背景色:#ffff77}
.diff_sub{背景色:#ffaaa}

旧的.csv
新的.csv 21001,CPP,米尔顿,200845621001,CPP,米尔顿,20104562008 31002,爪哇,吉尔森,200245631002,爪哇,吉尔森,2002 41003,Adobe Flex,201056641003,Adobe Flexi,约翰逊,2010566 51004,常识,辛森,200746551004,常识,辛普森,2007465 61005,动作脚本,吉尔托,20084806105,动作脚本,吉尔托,2008480 72000,戏剧,第一天,2020560
期望DIFFLIB的HTML DIFF输出:


table.diff{font-family:Courier;border:medium;}
.diff_标题{背景色:#e0}
td.diff_标题{文本对齐:右}
.diff_next{背景色:#C0}
.diff_添加{背景色:#aaffaa}
.diff_chg{背景色:#ffff77}
.diff_sub{背景色:#ffaaa}

旧的.csv
新的.csv 21001,CPP,米尔顿,200845621001,CPP,米尔顿,20104562008 31002,爪哇,吉尔森,200245631002,爪哇,吉尔森,2002 41003,Adobe Flex,201056641003,Adobe Flexi,约翰逊,2010566 51004,常识,辛森,200746551004,常识,辛普森,2007465 61005,动作脚本,吉尔托,20084806105,动作脚本,吉尔托,2008480 72000,戏剧,第一天,2020560
问题:我正在寻找一个单词级的亮点

实现
类逗号\u HtmlDiff
,将突出显示扩展到逗号边界:
您必须重载
difflib.ndiff

注意:只展开第一个突出显示的部分。
如果
difflib.ndiff
突出显示逗号,则不会更正此错误

输出


使用Python:3.4.2进行测试

我将尝试查找标记的段并将标记扩展到单词边界。另一种方法是复制difflib代码并将其修改为标记单词。我尝试过这样做。然而,我不是一个伟大的python专家,我查看了difflib,它使用SequenceMatcher和操作码进行标记。我找不到一种方法来给它贴上标签。你能告诉我在哪里找这个吗?相关的:它是相关的,但不能解决我的问题。我想没有人对这个difflib感兴趣。谢谢你的代码和回复。如果我遵循这个方法,我将得到的问题是,正如你所说的,整行被分割成单独的单词,每个单词组成一个新行。但是,我不希望将该行划分为多行。我希望整句话不受干扰,但强调不同的词。可能吗?非常感谢你,先生。它确实帮助我解决了我的问题。我将尝试实现你在笔记中提到的逗号部分。我试着投票,但因为我的低声誉,它去了主持人!!!我想问另一个问题(我希望这里没有重复我的问题……因为除了你之外,没有人回答我的问题)……是否可以使用difflib(就像我们在Unix diff中所做的那样)进行单词级的diff?。我知道difflib使用了一个
SequenceMatcher
,但是它的输出很尴尬,因为它不适合常规报告文件???@John:Checked
man diff(GNU diffutils)3.3
,但是没有看到任何关于word级别的内容。编辑您的问题并显示这样做的示例命令行。我无法想象
SequenceMatcher
如何与字级输出相关。使用difflib的主要思想是,我试图为Unix()中的
vimdiff
生成与此
DiffChar
插件相同的输出。但是,difflib的结果完全不同。我知道它使用不同的算法来检测变化,然而,这是我的全部想法。我将编辑这个问题,并尝试发布此问题所需的输入。