如何用Python移除文本文件每行末尾的CRLF并保留空行
解决文本文件去行尾CRLF并保留段落结构的问题
现有代码的问题
- 函数未接收文件路径参数,
save_text_path、filepath等变量未定义,无法定位目标文件 - 使用
'a'追加模式打开文件,会导致处理后的内容重复追加到原文件 - 尝试直接写入列表
Text1,write()方法仅接受字符串,会触发类型错误 - 未遍历文件列表,函数未被调用,实际未执行任何处理逻辑
正确实现方案
要实现移除行尾CRLF、保留空行分隔的段落结构、直接修改原文件,可按以下步骤操作:
- 遍历所有目标txt文件
- 读取文件内容,将同一段落的多行文本合并为一行,空行保留为段落分隔
- 处理完成后覆盖写入原文件
完整代码
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
相关产品推荐
相关产品推荐

