python实现两个文件对比的

这是一个简单的例子,实现两个文件的内容对比,使用python3实现,脚本在命令行中运行,首先输入两个需要检测是文件的路径,在得到文件的路径后,脚本开始按行读取文件的内容,内容会保存为一个列表类型,利用zip函数将两个文件列表上面的每行元素对应配对成一个可迭代的新对象。利用enumerate返回一个带索引的迭代器,然后利用for循环对每个元素的值进行比对,如果不一致,就将该元素连同索引的值进行打印,最后统计共有多少行的内容是不一样的。

完整代码和运行结果展示

首先来看一下完整的代码:

def compare_files(file1, file2):
    print("====文件检测开始====")
    with open(file1, 'r',encoding='utf-8') as f1, open(file2, 'r',encoding='utf-8') as f2:
        lines1 = f1.readlines()
        lines2 = f2.readlines()

    num_diff_lines = 0
    for line_num, (line1, line2) in enumerate(zip(lines1, lines2)):
        if line1 != line2:
            print("第 {} 行的内容不一致:".format(line_num + 1))
            print("  {}: {}".format(file1,line1.strip()))
            print("  {}: {}".format(file2,line2.strip()))
            num_diff_lines += 1

    print("====文件检测结束====")        

    if num_diff_lines == 0:
        print("两个文件内容完全一致")
    else:
        print("总共 {} 行内容不一致".format(num_diff_lines))


if __name__ == '__main__':

    in_file1 = input("请输入需要检测的第一个文件的绝对路径:")
    in_file2 = input("请输入需要检测的第二个文件的绝对路径:")

    compare_files(in_file1, in_file2)

可以看到,全部代码减掉空白行,仅20行代码。

拿两个文件:test1.txt test2.txt进行比对,文件的内容大致是长下图这个样子。

文件对比的测试文件

运行结果如下图。

对比文件运行结果

代码解析

从上面的完整代码可以看出,整个脚本没有用到第三方库,仅用了内置的enumerate和zip两个行数。所以在脚本的最上面,没用import导入库。

    in_file1 = input("请输入需要检测的第一个文件的绝对路径:")
    in_file2 = input("请输入需要检测的第二个文件的绝对路径:")

    compare_files(in_file1, in_file2)

main的脚本入口中,两个input用来获取用户输入两个需要检测的文件的路径。然后调用compare_files函数并出入两个文件的路径。

    with open(file1, 'r',encoding='utf-8') as f1, open(file2, 'r',encoding='utf-8') as f2:
        lines1 = f1.readlines()
        lines2 = f2.readlines()

打开两个文件,其中encoding是根据实际的文件编码将“utf-8”进行替换。这里的with然后通过逗号分隔,同时打开用户输入的两个文件。

    num_diff_lines = 0
    for line_num, (line1, line2) in enumerate(zip(lines1, lines2)):
        if line1 != line2:
            print("第 {} 行的内容不一致:".format(line_num + 1))
            print("  {}: {}".format(file1,line1.strip()))
            print("  {}: {}".format(file2,line2.strip()))
            num_diff_lines += 1

定义一个num_diff_lines的变量,初始值为0,用来统计不同的行数,然后利用for循环,比对一下两个文件每一行进行对比,如果行不一样,就将这不同的行和数和内容打印出来。

    if num_diff_lines == 0:
        print("两个文件内容完全一致")
    else:
        print("总共 {} 行内容不一致".format(num_diff_lines))

最后对num_diff_lines变量做一个判断,如果值为0,也就是说没用不一样的行,就输出“两个文件内容完全一致”,否则就输出总共有几行内容不一致。