如何使用Python合并多个SRT字幕文件并修正序号错乱问题
SRT字幕合并序号重复问题修复方案
问题原因
你当前的脚本只是简单拼接文件内容,没有处理每个SRT文件独立从1开始的序号字段,因此会出现序号重复的问题。
解决思路
由于你已经保证输入文件的时间轴是按先后顺序排列的,我们只需要在遍历文件内容时,识别原有字幕的序号行,替换为全局连续的新序号即可,其余内容(时间轴、字幕内容、空分隔行)保持不变。
轻量修复代码
filenames = ['sub1.srt', 'sub2.srt'] current_index = 1 # 全局连续序号,从1开始 with open('output_file.srt', 'w', encoding='utf-8') as outfile: for fname in filenames: with open(fname, encoding='utf-8') as infile: for line in infile: stripped_line = line.strip() # 判断当前行是否为纯数字的序号行 if stripped_line.isdigit(): # 替换为新的连续序号,保留原有换行符 outfile.write(f"{current_index}\n") current_index += 1 else: # 非序号行直接写入 outfile.write(line)
代码说明
- 新增
current_index变量作为全局序号计数器,初始值为1 - 逐行读取内容时,判断当前行是否为纯数字(即原SRT的序号行),如果是就写入当前的全局序号,同时计数器加1
- 其余非序号行(时间轴、字幕内容、空行)直接原封不动写入输出文件
- 额外添加了
encoding='utf-8'参数,避免不同编码的字幕文件出现乱码问题
高兼容修复方案
如果你的字幕内容存在单独一行是纯数字的情况,上述判断逻辑会误判,此时可以使用更严谨的按块解析SRT的方案,代码如下:
import re def parse_srt(file_path): """解析单个SRT文件,返回所有字幕条目列表,每个条目为(时间轴行, 字幕内容行列表)""" with open(file_path, encoding='utf-8') as f: content = f.read() # 正则匹配SRT的每个条目:数字 + 时间轴 + 字幕内容 + 空行 pattern = re.compile(r'\d+\n(\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3})\n(.*?)\n\n', re.DOTALL) items = [] for match in pattern.finditer(content): time_line = match.group(1) content_lines = match.group(2) items.append((time_line, content_lines)) return items filenames = ['sub1.srt', 'sub2.srt'] all_items = [] # 读取所有文件的条目 for fname in filenames: all_items.extend(parse_srt(fname)) # 重新编号写入输出文件 with open('output_file.srt', 'w', encoding='utf-8') as f: for idx, (time_line, content_lines) in enumerate(all_items, start=1): f.write(f"{idx}\n") f.write(f"{time_line}\n") f.write(f"{content_lines}\n\n")
该方案通过正则严格匹配SRT条目结构,不会受到字幕内容里数字的影响,兼容性更好。
内容的提问来源于stack exchange,提问作者japey49036m
相关产品推荐
相关产品推荐

