如何完善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
相关产品推荐
相关产品推荐

