You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何完善Python代码实现两文件夹文件差异对比,输出异名文件及内容差异?

文件夹与文件内容对比工具完善

现有代码仅能检测两个文件夹中仅单侧存在的文件,未实现文件内容对比功能。需要完善代码以达成以下目标:

  • 输出仅在其中一个文件夹存在的文件名
  • 对同时存在于两个文件夹的同名文件,对比内容并输出差异部分

完善后的完整代码

import os
import difflib

def compare_files(file1, file2):
    """对比两个文件的内容,输出差异部分"""
    differences_found = False
    try:
        with open(file1, 'r', encoding='utf-8') as f1, open(file2, 'r', encoding='utf-8') as f2:
            lines1 = f1.readlines()
            lines2 = f2.readlines()
        
        # 生成标准差异对比结果
        diff = difflib.unified_diff(
            lines1, lines2,
            fromfile=file1,
            tofile=file2,
            lineterm=''
        )
        
        diff_lines = list(diff)
        if diff_lines:
            print(f"\n=== 文件内容差异: {file1} vs {file2} ===")
            for line in diff_lines:
                print(line)
            differences_found = True
        return differences_found
    except Exception as e:
        print(f"对比文件时出错 {file1} 和 {file2}: {str(e)}")
        return False

def compare_folders(folder1, folder2):
    differences_found = False
    
    # 遍历第一个文件夹,检查文件是否存在于第二个文件夹
    for root, dirs, files in os.walk(folder1):
        for file in files:
            file1_path = os.path.join(root, file)
            # 生成对应文件夹中的文件路径
            rel_path = os.path.relpath(file1_path, folder1)
            file2_path = os.path.join(folder2, rel_path)
            
            if not os.path.exists(file2_path):
                print(f"文件仅存在于 {folder1}: {file1_path}")
                differences_found = True
            elif os.path.isfile(file2_path):
                # 对比文件内容
                if compare_files(file1_path, file2_path):
                    differences_found = True
    
    # 遍历第二个文件夹,检查是否有文件仅存在于此
    for root, dirs, files in os.walk(folder2):
        for file in files:
            file2_path = os.path.join(root, file)
            rel_path = os.path.relpath(file2_path, folder2)
            file1_path = os.path.join(folder1, rel_path)
            
            if not os.path.exists(file1_path):
                print(f"文件仅存在于 {folder2}: {file2_path}")
                differences_found = True

    if not differences_found:
        print("\n两个文件夹中的文件完全一致,未发现任何差异。")

if __name__ == "__main__":
    folder1 = input("请输入第一个文件夹的路径: ")
    folder2 = input("请输入第二个文件夹的路径: ")
    
    # 校验输入路径有效性
    if not os.path.isdir(folder1):
        print(f"错误: {folder1} 不是有效的文件夹路径")
        exit(1)
    if not os.path.isdir(folder2):
        print(f"错误: {folder2} 不是有效的文件夹路径")
        exit(1)
    
    compare_folders(folder1, folder2)

关键改进说明

  • 文件内容对比:使用Python内置difflib.unified_diff生成标准差异格式,清晰展示文件间的新增、删除和修改行。
  • 路径处理优化:改用os.path.relpath获取相对路径后拼接目标路径,避免直接字符串替换可能引发的路径错误。
  • 异常处理:增加文件读取异常捕获,处理编码错误、文件损坏等意外情况。
  • 状态标记完善:文件内容存在差异时同步更新全局差异标记,确保最终能准确判断文件夹一致性。
  • 输入校验:在主流程中增加文件夹路径有效性检查,提前拦截无效输入。

内容的提问来源于stack exchange,提问作者code space

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:03:32