Python文本枚举代码问题:消除空行并修正行号跳变
问题
需要对大型TXT文件进行行枚举以提升可读性,核心需求是将包含超过3个句子的大文本块拆分输出。当前代码存在两个问题:
- 输出后会留下无内容的空行
- 行号跳变(空行错误占用行号)
期望输出无冗余空行且行号连续递增。
当前错误输出示例
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
相关产品推荐
相关产品推荐

