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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:35:02