Python中的srt文件处理:读取、写入和操作字幕60


SRT (SubRip Subtitle) 文件是一种广泛使用的字幕文件格式,常用于视频播放器。 Python 提供了多种方法来处理 SRT 文件,例如读取字幕内容、修改字幕时间戳和文本、以及创建新的 SRT 文件。本文将深入探讨如何在 Python 中高效地处理 SRT 文件,并提供一些实用示例。

一、读取 SRT 文件

读取 SRT 文件最直接的方法是使用 Python 内置的 `open()` 函数结合文件处理技巧。SRT 文件的结构清晰,每一行都具有特定的含义。一般来说,一个字幕条目包含一个序号、时间戳和字幕文本。我们可以利用这个结构来解析文件内容。

以下是一个简单的函数,用于读取 SRT 文件并将其内容解析成一个 Python 列表,其中每个元素代表一个字幕条目,以字典的形式存储:```python
import re
def read_srt(filepath):
"""
Reads an SRT file and returns a list of dictionaries, where each dictionary
represents a subtitle entry.
"""
try:
with open(filepath, 'r', encoding='utf-8') as f: # utf-8 encoding is crucial for handling various characters
lines = ()
except FileNotFoundError:
return None # Handle file not found error
subtitles = []
i = 0
while i < len(lines):
try:
index = int(lines[i].strip())
timestamp_line = lines[i+1].strip()
text_lines = []
i += 2
while i < len(lines) and lines[i].strip() != '':
(lines[i].strip())
i += 1
subtitle = {
'index': index,
'timestamp': timestamp_line,
'text': ''.join(text_lines)
}
(subtitle)
except (ValueError, IndexError):
# Handle invalid lines gracefully
i += 1
continue
return subtitles
# Example usage:
filepath = ''
subtitles = read_srt(filepath)
if subtitles:
for subtitle in subtitles:
print(f"Index: {subtitle['index']}")
print(f"Timestamp: {subtitle['timestamp']}")
print(f"Text: {subtitle['text']}")
print("-" * 20)
else:
print(f"Error: File '{filepath}' not found.")
```

这个函数使用了 `try-except` 块来处理潜在的错误,例如文件未找到或文件格式无效。 `utf-8` 编码的指定对于处理包含非ASCII字符的字幕至关重要。

二、处理字幕

一旦我们读取了字幕数据,就可以对它们进行各种操作,例如:
修改时间戳: 可以使用正则表达式或字符串操作来提取和修改时间戳。这对于调整字幕与视频同步非常有用。
修改字幕文本: 可以直接修改字典中的 `text` 字段来改变字幕内容。例如,可以进行翻译、校对或添加特殊效果。
添加或删除字幕: 可以向 `subtitles` 列表中添加新的字典,或者删除已有的字典来添加或删除字幕条目。
过滤字幕: 可以根据字幕文本或时间戳来过滤字幕,只保留需要的部分。

以下是一个示例,演示如何修改字幕的时间戳:```python
import re
def modify_timestamp(subtitle, offset_seconds):
"""Modifies the timestamp of a subtitle entry by a given offset."""
match = (r"(\d{2}):(\d{2}):(\d{2}),(\d{3}) --> (\d{2}):(\d{2}):(\d{2}),(\d{3})", subtitle['timestamp'])
if match:
groups = ()
new_timestamp = ""
for i in range(0, 8, 2):
time_part = int(groups[i]) * 3600 + int(groups[i+1]) * 60 + int(groups[i+2]) * 1 + int(groups[i+3]) / 1000
new_time_part = time_part + offset_seconds
hours = int(new_time_part // 3600)
minutes = int((new_time_part % 3600) // 60)
seconds = int(new_time_part % 60)
milliseconds = int((new_time_part * 1000) % 1000)
new_timestamp += f"{hours:02d}:{minutes:02d}:{seconds:02d},{milliseconds:03d}"
if i < 6:
new_timestamp += " --> "
subtitle['timestamp'] = new_timestamp
return subtitle
# Example usage: Adjust all timestamps by +5 seconds
for subtitle in subtitles:
modify_timestamp(subtitle, 5)
```

三、写入 SRT 文件

最后,我们需要将修改后的字幕数据写入新的 SRT 文件。这可以使用类似于读取文件的方法,只是将文件打开模式改为 'w',并根据 SRT 文件的格式将数据写入文件。
```python
def write_srt(filepath, subtitles):
"""Writes a list of subtitle dictionaries to an SRT file."""
try:
with open(filepath, 'w', encoding='utf-8') as f:
for subtitle in subtitles:
(str(subtitle['index']) + '')
(subtitle['timestamp'] + '')
(subtitle['text'].replace('', '') + '') # Preserve existing line breaks
except Exception as e:
print(f"Error writing to file: {e}")
# Example usage:
write_srt('', subtitles)
```

这个函数同样使用了 `utf-8` 编码,并处理了潜在的写入错误。请注意, `` 的处理是为了正确保留字幕文本中的换行符。

四、总结

本文介绍了如何使用 Python 读取、处理和写入 SRT 文件。 通过结合文件处理、正则表达式和字符串操作,我们可以轻松地修改字幕内容,从而实现字幕的翻译、时间校正以及其他相关的操作。 记住始终使用 `utf-8` 编码来确保兼容性,并处理潜在的错误以提高代码的健壮性。

希望本文能够帮助您更好地理解如何在 Python 中处理 SRT 文件,并为您的字幕处理任务提供便利。

2025-05-22


上一篇:Python 函数嵌套:高级用法与最佳实践

下一篇:Python字符串高效记忆与运用技巧