编写Python脚本对比两目录同名文件差异行并输出
解决目录文件对比及内容差异行输出问题
需求梳理
- 对比两个目录(如
cd1和cd2),识别仅存在于单一目录的文件 - 对两个目录中同名的文件,逐行对比内容,输出双方的差异行
错误原因
你遇到的异常是因为代码错误地将文件名字符串当作可迭代对象遍历(比如for char in filename:),导致遍历的是文件名的每个字符而非文件内容,完全偏离了需求。
正确实现方案
下面是基于os和difflib模块的实现代码,既可以识别目录间的文件差异,也能精准输出同名文件的内容差异行:
import os import difflib def compare_directories(dir1, dir2): # 获取两个目录的文件名集合 files_dir1 = set(os.listdir(dir1)) files_dir2 = set(os.listdir(dir2)) # 输出仅存在于单个目录的文件 only_dir1 = files_dir1 - files_dir2 if only_dir1: print(f"仅在{dir1}中存在的文件:") for file in only_dir1: print(f"- {file}") only_dir2 = files_dir2 - files_dir1 if only_dir2: print(f"\n仅在{dir2}中存在的文件:") for file in only_dir2: print(f"- {file}") # 对比同名文件的内容差异 common_files = files_dir1 & files_dir2 if common_files: print("\n=== 同名文件内容差异 ===") for file in common_files: file_path1 = os.path.join(dir1, file) file_path2 = os.path.join(dir2, file) # 读取文件内容(指定编码避免乱码) with open(file_path1, 'r', encoding='utf-8') as f1: lines1 = f1.readlines() with open(file_path2, 'r', encoding='utf-8') as f2: lines2 = f2.readlines() # 生成并输出差异行 diff = difflib.unified_diff( lines1, lines2, fromfile=f"{dir1}/{file}", tofile=f"{dir2}/{file}", lineterm='' ) diff_lines = list(diff) if diff_lines: print(f"\n{file} 的差异:") for line in diff_lines: print(line) # 调用示例 if __name__ == "__main__": compare_directories("cd1", "cd2")
代码说明
- 目录文件差异识别:通过集合的差集运算,快速找出仅存在于
cd1或cd2的文件,比如示例中的txt3.txt会被标记为仅在cd2存在。 - 文件内容对比:
- 使用
with open()安全读取文件内容,避免资源泄漏 - 借助
difflib.unified_diff生成标准的差异格式:- 以
-开头的行是dir1独有的内容(比如cd1/txt1.txt的line4、line6) - 以
+开头的行是dir2独有的内容(比如cd2/txt1.txt的line5)
- 以
- 使用
- 编码处理:指定
encoding='utf-8'确保读取中文等非ASCII字符时不会出错。
示例输出
针对你描述的场景,运行代码后会输出类似内容:
仅在cd2中存在的文件: - txt3.txt === 同名文件内容差异 === txt1.txt 的差异: --- cd1/txt1.txt +++ cd2/txt1.txt @@ -1,5 +1,4 @@ line1 line2 line3 -line4 -line6 +line5
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

