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

如何用Python移除文本文件每行末尾的CRLF并保留空行

解决文本文件去行尾CRLF并保留段落结构的问题

现有代码的问题

  • 函数未接收文件路径参数,save_text_path、filepath等变量未定义,无法定位目标文件
  • 使用'a'追加模式打开文件,会导致处理后的内容重复追加到原文件
  • 尝试直接写入列表Text1,write()方法仅接受字符串,会触发类型错误
  • 未遍历文件列表,函数未被调用,实际未执行任何处理逻辑

正确实现方案

要实现移除行尾CRLF、保留空行分隔的段落结构、直接修改原文件,可按以下步骤操作:

  1. 遍历所有目标txt文件
  2. 读取文件内容,将同一段落的多行文本合并为一行,空行保留为段落分隔
  3. 处理完成后覆盖写入原文件

完整代码

import glob
import time
import os

def process_text_file(filepath):
    # 读取文件内容
    with open(filepath, "r", encoding="utf-8") as fp:
        lines = fp.readlines()
    
    processed_lines = []
    current_paragraph = []
    
    for line in lines:
        # 仅去除行尾的CRLF,保留行内空格
        stripped_line = line.rstrip('\r\n')
        if stripped_line:
            # 非空行加入当前段落缓存
            current_paragraph.append(stripped_line)
        else:
            # 遇到空行,先合并当前段落再加入结果,同时保留空行
            if current_paragraph:
                processed_lines.append(' '.join(current_paragraph))
                current_paragraph = []
            processed_lines.append('')
    
    # 处理文件末尾未闭合的段落
    if current_paragraph:
        processed_lines.append(' '.join(current_paragraph))
    
    # 覆盖写入原文件
    with open(filepath, "w", encoding="utf-8") as fp:
        fp.write('\n'.join(processed_lines))
    
    print(f"处理完成:{filepath}")

if __name__ == "__main__":
    txt_filepaths = glob.glob("**/*.txt", recursive=True)
    start = time.time()
    
    for filepath in txt_filepaths:
        process_text_file(filepath)
    
    print(f"总耗时:{time.time() - start} 秒")

关键说明

  • 段落合并逻辑:用current_paragraph缓存同一段落的所有非空行,遇到空行时将缓存内容用空格连接成一行,既移除了行尾CRLF,又保留了段落完整性
  • 空行保留:空行直接以空字符串形式加入结果列表,最终通过'\n'.join()转为换行符,维持原有的段落分隔结构
  • 直接修改原文件:采用先读后写的方式,用'w'模式覆盖原文件内容,无需创建临时文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:30:49