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

Python文本枚举代码问题:消除空行并修正行号跳变

问题

需要对大型TXT文件进行行枚举以提升可读性,核心需求是将包含超过3个句子的大文本块拆分输出。当前代码存在两个问题:

  1. 输出后会留下无内容的空行
  2. 行号跳变(空行错误占用行号)
    期望输出无冗余空行且行号连续递增。

当前错误输出示例

1. How are you today? Very well thank you.
2. 
3. How are you doing, it has been a while.
4. 

期望输出示例

1. How are you today? Very well thank you.
2. How are you doing, it has been a while.
3. 
4. 

输入示例(中文翻译)

‘好吧,殿下,热那亚和卢卡现在不过是波拿巴家族的领地而已。我提前告诉你,如果你不承认我们处于战争状态,如果你还敢为那个反基督者——我真的相信他就是——的所有谎言、所有暴行辩护,那我就不再认识你了,你不再是我的朋友,不再是你自称的忠实仆人。晚安,晚安。我看我吓到你了。请坐,你还有什么要禀报的吗?’

1805年7月,著名的安娜·帕夫洛夫娜·谢列尔——皇后玛丽亚·费奥多罗夫娜的侍女和亲信——用这番话迎接了尊贵的瓦西里亲王,他是第一个来到她沙龙的客人。安娜·帕夫洛夫娜已经咳嗽了好几天,她得了“流感”,就像她自己说的那样(“流感”在当时是个新词,只有少数人使用),因此她没有去值班,也没有出门。早上由红衣侍从送来的请柬上,不分身份地写着:

‘如果伯爵(或亲王)您没有更好的安排,如果您不介意来一个可怜病人的沙龙,我将很高兴今天7点到10点之间见到您。’

修复后的代码
import re

# 定义输入输出文件路径
input_file_path = "book1.txt"
output_file_path = "output4.txt"

# 每行允许的最大句子数
max_sentences = 3

# 初始化行号计数器
line_num = 1

# 读取输入文件
with open(input_file_path, "r") as input_file:
    with open(output_file_path, "w") as output_file:
        for line in input_file:
            stripped_line = line.strip()
            # 直接处理原文件中的空行
            if not stripped_line:
                output_file.write(f"{line_num}. \n")
                line_num += 1
                continue
            
            # 拆分句子,处理末尾无分隔符的情况
            sentences = re.split("(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)\s", stripped_line)
            # 过滤拆分后产生的空字符串
            sentences = [s for s in sentences if s.strip()]
            
            if len(sentences) > max_sentences:
                current_block = []
                for sentence in sentences:
                    current_block.append(sentence.strip())
                    # 达到最大句子数时写入文件
                    if len(current_block) == max_sentences:
                        output_file.write(f"{line_num}. {' '.join(current_block)}\n")
                        line_num += 1
                        current_block = []
                # 写入剩余的句子
                if current_block:
                    output_file.write(f"{line_num}. {' '.join(current_block)}\n")
                    line_num += 1
            else:
                # 直接写入原内容(已去除首尾空白)
                output_file.write(f"{line_num}. {stripped_line}\n")
                line_num += 1

关键修改点

  • 空行直接处理:新增对原文件空行的判断逻辑,直接输出带行号的空行,避免后续处理导致的冗余空行和行号错误。
  • 句子过滤:拆分句子后过滤掉空字符串,避免空句子被计入数量导致的错误拆分。
  • 简化缓冲区逻辑:改用列表收集句子,达到max_sentences时直接拼接写入,避免原代码逐词拼接产生的冗余空格和空行。
  • 统一输出格式:所有行使用f-string格式化,确保行号与内容无多余间隔,输出风格一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:48:12