当前位置: 首页 > 后端技术 > Python

比较两个文本文件

时间:2023-03-26 16:57:52 Python

考虑两个文本文件file_1_1.txt和file_1_2.txt:file_1_1.txt1要删除的行:12要删除的行:23保留的行:14保留的行:25要更改的行:16保留的行:37保留一行:48保留一行:59保留一行:610删除一行:311保留一行:712保留一行:813更改一行:214更改一行:315改行:416改行:517留行:9file_1_2.txt1留行:12插入行:13留行:24改行:15留行:36A留下的行:47插入的行:28插入的行:39留下的行:510留下的行:611留下的行:712留下的行:813改变的行:214改变的行:315改变的一行:416留下的一行:9Unixdiff命令可以应用于file_1_1.txt和file_1_2.txt:$difffile_1_1.txtfile_1_2.txt1,2d0<要删除的行:1<要删除的行:23a2&g吨;要插入的一行:15c4<要更改的行:1--->更改的行:17a7,8>要插入的行:2>要插入的行:310d10<要删除的行:313,16c13,15Achangedline:2>Achangedline:3>Achangedline:4研究这个例子理解diff的输出。d用于删除,用于l_1dl_2形式的命令,带有l_1和l_2两个行号,或者形式l_1,l_2dl_3带有l_1,l_2和l_3三个行号。a用于添加,用于命令具有l_1和l_2两个行号的l_1al_2形式,或具有l_1、l_2和l_3三个行号的l_1al_2、l_3形式。c用于更改,用于具有l_1和l_2两个行号的l_1cl_2形式的命令,或形式l_1,l_2cl_3与l_1,l_2和l_3三个行号,或形式l_1cl_2,l_3与l_1,l_2和l_3三个行号,或形式l_1,l_2cl_3,l_4与l_1,l_2,l_3和l_4四行numbers.diff标识两个文件共有的行的最长公共子序列(LCS)。然后它计算出唯一的最小命令集,允许将第一个文件转换为第二个文件(ed编辑器实际上可以精确地执行此操作)。对于前面的示例,有一个唯一的LCS,由以下行组成:Alinethatstay:1,Alinethatstay:2,Alinethatstays:3andAlinethatstay:4StillLCS并不总是唯一的。例如,考虑两个文本文件file_2_1.txt和file_2_2.txt:file_2_1.txt1Alinefile_2_2.txt1Aline2Aline然后有2个LCS,可以从file_2_2.txt中选择第一行或第二行。Unixdiff确定一个LCS并产生相应的输出:$difffile_2_1.txtfile_2_2.txt1a2>Aline但另一种实现可能有输出:$difffile_2_1.txtfile_2_2.txt0a1>Aline对于另一个例子,考虑两个文本文件file_3_1。文本文件和file_3_2.txt:file_3_1.txt1Line12Line23Alinetogo4Alinetogo5Alinetogo6Line37Line48Alinetogofile_3_2.txt1Alinetocome2Alinetocome3Line14Line25Alinetocome6Alinetocome7Line18Line29Alinetocome10Alinetocome11Alinetocome12Line313Line45然后有3个LCS,因为第一个文件中第1行和第2行的唯一出现可以与第一个出现的匹配第二个文件中的第1行和第2行,或者在第二个文件中第一次出现第1行和第二次出现第2行,或者在第二个文件中第二次出现第1行和第2行。Unixdiff确定一个LCS并产生相应的输出:$difffile_3_1.txtfile_3_2.txt0a1,2>Alinetocome>Alinetocome3,5c5,11来线>来线>1线>2线>来线>来线>来线8d13<阿李netogo但是另一种实现可能会输出0a1,2>Alinetocome>Alinetocome1a4,7>Line2>Alinetocome>Alinetocome>Line13,5c9,11Alinetocome>Alinetocome>Alinetocome8d13Alinetocome>Alinetocome>1号线>2号线>一条线要来>一条线要来3,5c9,11<一条线要走<一条线要走<一条线要走--->一条线要来>一条线要来>一条线要走8d13<一条线togoOne可能想要输出两个文件共有的LCS,其中...对于不属于LCS的最长非空行序列,w.r.t.第一个文件,或w.r.t.第二个文件。对于应用于file_1_1.txt和file_1_2.txt的Unixdiff,那将是w.r.t。file_1_1.txt:...留下的一行:1留下的一行:2...留下的一行:3留下的一行:4留下的一行:5留下的一行ays:6...Alinethatstay:7Alinethatstays:8...Alinethatstays:97andw.r.t.file_1_2.txt:留下的一行:1...留下的一行:2...留下的一行:3留下的一行:4...留下的一行:5留下的一行:6留下的一行:7Alinethatstays:8...Alinethatstays:9对于应用于file_2_1.txt和file_2_2.txt的Unixdiff,那将是w.r.t.file_2_1.txt:Alineandw.r.t.file_2_2.txt:一行...对于应用于file_3_1.txt和file_3_2.txt的Unixdiff,那将是w.r.t.file_3_1.txt:第1行第2行...第3行第4行...和??w.r.t.file_3_2.txt:...第1行第2行...第3行第4行任务规范编写一个程序存储在名为diff.py的文件中,该文件实现三个类,?DiffCommands,?DiffCommandsError?OriginalNewFiles,第二个派生自Exception。DiffCommands不提供任何公共接口中的方法。它从一个文本文件构建一个DiffCommands对象,用于存储一个合理的diff命令序列,在每行一个命令,任何行上都没有空格,也没有任何额外的行。如果文本文件不满足这些条件,DiffCommands的__init__()方法会引发DiffCommandsError错误,消息为“不可能是两个文件差异的命令”提供了七个此类文件(wrong_1.txt到wrong_7.txt)。提供了三个文件,您可以从中构建DiffCommands对象:diff_1.txt,它存储样本文件file_1_1.txt和file_1_2.txt的diff命令的唯一可能序列;diff_2.txt,它存储两个可能序列之一示例文件file_2_1.txt和file_2_2.txt的diff命令;diff_3.txt,它存储示例文件file_3_1.txt和file_3_2.txt的三种可能的diff命令序列之一。DiffCommands实现了__str__()函数,因此print()可用于输出正在考虑的对象的diff命令。OriginalNewFiles提供具有4种方法的用户界面:?output_diff()?output_unmodified_from_original()?output_unmodified_from_new()?get_all_diff_commands()下面的交互示例显示了应该如何调用这些方法以及它们应该返回什么。从该示例中可能不明显的唯一一点是,在方法OriginalNewFiles.pair_of_files.get_all_diff_commands()输出的差异命令序列中,差异命令按字典顺序排列。SolutionCode结构应该是这样的:让我们关注如何实现功能get_all_diff_commandsExamplepair_of_files=OriginalNewFiles('file_3_2.txt','file_3_1.txt')diffs=pair_of_files.get_all_diff_commands()创建一棵树如下:获取最大级别的叶子然后将所有LCS转移到命令中按字典顺序排序链接:附件密码:4sa9