Python 解析 SRT 文件指南

引言

在媒体播放中,SRT(SubRip Subtitle)文件是一种常见的字幕文件格式,广泛应用于视频文件中,为用户提供更好的观看体验。SRT 文件的结构相对简单,但对于初学者来说,解析这些文件可能会面临一些挑战。在这篇文章中,我们将通过 Python 来学习如何解析 SRT 文件,并将其内容提取、格式化及输出。文章中将提供代码示例、关系图和甘特图,帮助大家更好地理解整个过程。

SRT 文件结构

一个典型的 SRT 文件由多个字幕条目组成,每个条目的结构如下:

1
00:00:01,000 --> 00:00:05,000
这是第一条字幕

2
00:00:06,000 --> 00:00:10,000
这是第二条字幕

每个条目包含三部分:

  1. 字幕序号
  2. 时间戳,表示字幕的起始和结束时间
  3. 字幕文本

SRT 文件解析

使用 Python 解析 SRT

我们可以使用 Python 的文本处理能力轻松解析 SRT 文件。以下是一个示例代码,演示如何读取和解析 SRT 文件中的内容。

import re

class Subtitle:
    def __init__(self, index, start_time, end_time, text):
        self.index = index
        self.start_time = start_time
        self.end_time = end_time
        self.text = text

    def __repr__(self):
        return f"Subtitle({self.index}, {self.start_time}, {self.end_time}, {self.text})"

def parse_srt(file_path):
    subtitles = []
    with open(file_path, 'r', encoding='utf-8-sig') as file:
        content = file.read()

        # 使用正则表达式提取字幕条目
        entries = re.split(r'\n\s*\n', content.strip())
        for entry in entries:
            parts = entry.splitlines()
            if len(parts) < 3:
                continue
            
            index = int(parts[0])
            time_range = parts[1].split(' --> ')
            start_time = time_range[0].strip()
            end_time = time_range[1].strip()
            text = " ".join(parts[2:])
            
            subtitles.append(Subtitle(index, start_time, end_time, text))
    
    return subtitles

# 示例用法
srt_file_path = 'example.srt'
subtitles = parse_srt(srt_file_path)
for subtitle in subtitles:
    print(subtitle)

代码解释

  1. Subtitle 类:定义一个用于存储单个字幕的类,包含序号、起始时间、结束时间和字幕文本。
  2. parse_srt 函数:这是解析 SRT 文件的主要函数。它使用 Python 的内置文件处理功能读取文件内容,使用正则表达式分割多个字幕条目。
  3. 时间戳解析:从每个条目中提取时间戳,并将字幕内容整理为一个完整的句子。

使用示例

假设我们有一个名为 example.srt 的字幕文件,内容如下:

1
00:00:01,000 --> 00:00:05,000
这是第一条字幕

2
00:00:06,000 --> 00:00:10,000
这是第二条字幕

运行上述代码后,输出结果将如下:

Subtitle(1, 00:00:01,000, 00:00:05,000, 这是第一条字幕)
Subtitle(2, 00:00:06,000, 00:00:10,000, 这是第二条字幕)

关系图

下面是解析 SRT 文件时涉及的类和数据之间的关系图,帮助我们理解数据的结构。

erDiagram
    Subtitle {
        int index
        string start_time
        string end_time
        string text
    }

    ParseSRT {
        string file_path
    }

    ParseSRT ||--o{ Subtitle : contains

甘特图

在解析 SRT 文件的过程中,我们可以将步骤可视化为甘特图,帮助我们更好地理解每个步骤之间的时间关系。

gantt
    title SRT 文件解析流程
    dateFormat  YYYY-MM-DD
    section 文件读取
    打开文件          :a1, 2023-10-01, 1d
    section 内容处理
    分割条目          :a2, after a1, 1d
    提取信息          :a3, after a2, 2d
    section 数据整理
    创建 Subtitle 对象 :a4, after a3, 1d

处理异常

在实际应用中,你可能会遇到格式不标准的 SRT 文件,导致解析失败。为了确保程序的鲁棒性,可以添加一些异常处理机制。

def parse_srt(file_path):
    subtitles = []
    try:
        with open(file_path, 'r', encoding='utf-8-sig') as file:
            content = file.read()
            entries = re.split(r'\n\s*\n', content.strip())
            for entry in entries:
                parts = entry.splitlines()
                if len(parts) < 3:
                    continue
                
                index = int(parts[0])
                time_range = parts[1].split(' --> ')
                start_time = time_range[0].strip()
                end_time = time_range[1].strip()
                text = " ".join(parts[2:])
                
                subtitles.append(Subtitle(index, start_time, end_time, text))
    except FileNotFoundError:
        print(f"文件 {file_path} 未找到")
    except Exception as e:
        print(f"解析过程中出现错误: {e}")

    return subtitles

总结

在这篇文章中,我们介绍了如何使用 Python 解析 SRT 文件,提取字幕内容,并将其展示为易于理解的结构。通过示例代码和可视化图表,读者应该能够掌握基础的 SRT 文件解析技能。在实际项目中,这些技术可以进一步扩展,以实现更多功能,例如字幕翻译、时间调整或格式转换。

希望这篇文章可以帮助你在处理 SRT 文件时更加得心应手,并激发你探索更多 Python 编程的乐趣!