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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:55:16