Python写入文件仅保留末尾内容问题排查与修复
问题原因与修复方案
原因
你在循环内部每次使用'w'模式打开文件,该模式的核心特性是:打开文件时会立即清空原有所有内容,再写入新数据。因此循环每执行一次,之前写入的内容都会被覆盖,最终文件仅保留最后一次循环写入的片段。
修复方案
有两种高效的解决方式,同时修正代码中判断字符串的小问题:
方案1:先拼接所有内容,一次性写入
先将所有片段拼接成完整字符串,再用'w'模式一次性写入文件,避免重复打开关闭文件,效率更高:
from datetime import timedelta full_content = "" for segment in segments: startTime = f"0{timedelta(seconds=int(segment['start']))},000" endTime = f"0{timedelta(seconds=int(segment['end']))},000" text = segment['text'] segmentId = segment['id'] + 1 # 修正:用startswith判断更安全,避免空字符串索引报错 processed_text = text[1:] if text.startswith(' ') else text segment = f"{segmentId}\n{startTime} --> {endTime}\n{processed_text}\n\n" full_content += segment with open(filepath, 'w', encoding='utf-8') as srtFile: srtFile.write(full_content)
方案2:循环内以追加模式写入
如果需要保留循环内逐段写入的逻辑,可先清空文件,再用'a'(追加)模式逐段写入:
from datetime import timedelta # 先清空目标文件 with open(filepath, 'w', encoding='utf-8'): pass for segment in segments: startTime = f"0{timedelta(seconds=int(segment['start']))},000" endTime = f"0{timedelta(seconds=int(segment['end']))},000" text = segment['text'] segmentId = segment['id'] + 1 processed_text = text[1:] if text.startswith(' ') else text segment = f"{segmentId}\n{startTime} --> {endTime}\n{processed_text}\n\n" # 用追加模式写入,不会清空原有内容 with open(filepath, 'a', encoding='utf-8') as srtFile: srtFile.write(segment)
额外优化点
- 原代码中
str(0)+str(timedelta(...))可简化为f"0{timedelta(...)}",写法更简洁。 - 替换
text[0] is ' '为text.startswith(' '):is用于判断对象身份,判断字符串值相等应该用==,而startswith还能避免文本为空时的索引报错。
内容的提问来源于stack exchange,提问作者Ashmit Singh
相关产品推荐
相关产品推荐

