如何在Python的ndiff库中忽略空行并仅打印+行及对应行号?
实现仅显示minitext.txt新增非空行及对应行号
问题背景
使用difflib.ndiff对比完整歌词文件textest.txt和部分歌词文件minitext.txt时,当前输出包含空行、-标记行等冗余内容,需要仅输出minitext.txt中新增的(+标记)非空行,并显示该行在minitext.txt中的对应行号。
原代码如下:
import io import difflib import re with io.open('textest.txt', mode="r", encoding="utf_8_sig") as file: lines1 = file.readlines() with io.open('minitext.txt', mode="r", encoding="utf_8_sig") as file: lines2 = file.readlines() def prefilter(line): return re.sub("\s+"," ",line.strip()) for d in difflib.ndiff([prefilter(x) for x in lines1],[prefilter(x) for x in lines2]): print(d)
解决方案
修改代码,通过跟踪minitext.txt的行号,过滤冗余内容,仅保留新增非空行:
import io import difflib import re def prefilter(line): return re.sub("\s+", " ", line.strip()) # 读取两个文件内容 with io.open('textest.txt', mode="r", encoding="utf_8_sig") as file: lines1 = file.readlines() with io.open('minitext.txt', mode="r", encoding="utf_8_sig") as file: lines2 = file.readlines() # 预处理两行文本,统一格式 processed_lines1 = [prefilter(line) for line in lines1] processed_lines2 = [prefilter(line) for line in lines2] # 初始化minitext.txt的行号(从1开始) current_line_num = 1 for diff_entry in difflib.ndiff(processed_lines1, processed_lines2): # 跳过预处理后为空的行 content = diff_entry[2:].strip() if not content: # 空行属于minitext.txt的行时,行号仍需递增 if diff_entry.startswith((' ', '+')): current_line_num += 1 continue # 仅处理新增的行(+标记) if diff_entry.startswith('+'): print(f"行号 {current_line_num}: {content}") # 更新行号:空格/+开头的行对应minitext.txt中的实际行 if diff_entry.startswith((' ', '+')): current_line_num += 1
关键说明
- 保持
prefilter函数统一处理文本中的空格和换行,确保对比一致性 - 用
current_line_num跟踪minitext.txt的行号,从1开始符合常规文件行号逻辑 - 过滤预处理后为空的行,避免输出无效内容
- 仅匹配
+开头的diff行,提取内容并显示对应行号 - 仅当diff行是空格(两文件共有)或
+(新增)时递增行号,-开头的行属于原文件独有,不影响minitext.txt的行号计数
内容的提问来源于stack exchange,提问作者patrick001p
相关产品推荐
相关产品推荐

