.srt(SubRip Subtitle)檔案廣泛應用於電影、電視節目及線上影片中,用於顯示對白及其他文字資訊。然而,隨著時間的推移和多次編輯,字幕檔案中可能出現重複的字幕行,這不僅影響觀看體驗,還可能增加檔案大小。為了解決這一問題,使用Python自動化處理.srt檔案成為一個高效的解決方案。本指南將詳細介紹如何編寫一個Python腳本,讀取.srt檔案,統計並管理重複字幕,並輸出經過處理的新檔案。
以下完整的Python腳本實現了上述需求。腳本分為多個函數,分別負責讀取檔案、解析字幕、統計重複字幕、與用戶互動決策,以及寫入新的字幕檔案。該腳本支援中文、英文和日文字幕,並能處理多種編碼格式。
import re
from collections import defaultdict, Counter
def read_srt_file(file_path):
"""
讀取.srt檔案,嘗試多種編碼,返回檔案內容。
"""
try:
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
return content
except UnicodeDecodeError:
# 嘗試其他常見編碼
encodings = ['cp950', 'shift-jis', 'gb18030']
for encoding in encodings:
try:
with open(file_path, 'r', encoding=encoding) as file:
content = file.read()
return content
except UnicodeDecodeError:
continue
raise Exception("無法識別檔案編碼。請確認檔案的編碼格式。")
def parse_srt(content):
"""
解析.srt檔案內容,返回字幕列表。
"""
blocks = re.split(r'\n\n+', content.strip())
subtitles = []
for block in blocks:
lines = block.strip().split('\n')
if len(lines) >= 3:
number = lines[0]
timestamp = lines[1]
text = '\n'.join(lines[2:]).strip()
subtitles.append({
'number': number,
'timestamp': timestamp,
'text': text
})
return subtitles
def find_duplicates(subtitles):
"""
找出重複的字幕文本並統計出現次數。
返回一個字典,鍵為字幕文本,值為出現的索引列表。
"""
text_count = defaultdict(list)
for i, subtitle in enumerate(subtitles):
text_count[subtitle['text']].append(i)
# 返回出現超過一次的字幕
return {text: indices for text, indices in text_count.items() if len(indices) > 1}
def write_new_srt(output_path, subtitles):
"""
將處理後的字幕列表寫入新的.srt檔案。
"""
with open(output_path, 'w', encoding='utf-8') as file:
for i, subtitle in enumerate(subtitles, 1):
if subtitle: # 確保字幕未被刪除
file.write(f"{i}\n")
file.write(f"{subtitle['timestamp']}\n")
file.write(f"{subtitle['text']}\n\n")
def process_duplicates(subtitles, duplicates):
"""
與用戶互動,決定是否刪除重複字幕。
"""
for text, indices in duplicates.items():
print(f"\n發現重複字幕: \"{text}\"")
print(f"出現次數: {len(indices)}")
while True:
choice = input("是否要刪除這個重複字幕?輸入 '刪除' 或 '保留': ").strip()
if choice == '刪除':
# 刪除所有相同的字幕行
for index in indices:
subtitles[index] = None
print("已刪除所有相同的字幕行。")
break
elif choice == '保留':
print("保留該字幕。")
break
else:
print("無效的輸入,請重新輸入。")
# 移除被標記為None的字幕
subtitles = [s for s in subtitles if s is not None]
return subtitles
def main():
"""
主函數,執行整個處理流程。
"""
input_file = input("請輸入要處理的.srt檔案路徑: ").strip()
output_file = input("請輸入輸出新的.srt檔案路徑: ").strip()
# 讀取並解析字幕檔
try:
content = read_srt_file(input_file)
except Exception as e:
print(f"錯誤: {e}")
return
subtitles = parse_srt(content)
if not subtitles:
print("字幕檔案解析失敗或檔案格式不正確。")
return
# 找出重複的字幕
duplicates = find_duplicates(subtitles)
if not duplicates:
print("沒有發現重複的字幕。")
else:
# 處理重複字幕
subtitles = process_duplicates(subtitles, duplicates)
# 寫入新的字幕檔案
write_new_srt(output_file, subtitles)
print(f"新的字幕檔案已儲存至: {output_file}")
if __name__ == "__main__":
main()
腳本的第一步是讀取.srt檔案內容。由於不同語言可能使用不同的編碼,read_srt_file
函數首先嘗試以UTF-8編碼讀取檔案。如果失敗,則依序嘗試CP950(繁體中文)、Shift-JIS(日文)及GB18030(簡體中文)等常見編碼。如果所有嘗試均失敗,腳本將拋出一個錯誤,提示無法識別檔案編碼。
parse_srt
函數使用正則表達式將整個檔案內容拆分為多個區塊,每個區塊代表一個字幕。每個區塊通常包含三部分:字幕編號、時間戳及字幕文本。函數將這些部分提取並存儲在一個字典列表中,以便後續處理。
為了找出重複的字幕行,find_duplicates
函數會遍歷所有字幕文本,並使用defaultdict
來統計每條字幕出現的索引。這樣可以輕鬆識別出現次數超過一次的字幕文本。
process_duplicates
函數負責與用戶互動,詢問是否刪除每一組重複字幕。若用戶選擇刪除,則將這些字幕行從列表中標記為None
,最終在過濾階段移除這些標記。
經過處理後的字幕列表將由write_new_srt
函數寫入新的.srt檔案中。每個字幕行的編號將重新排序,確保檔案的格式正確。
字幕檔案可能使用多種編碼格式,特別是涉及多語言的情況。為了確保腳本能夠正確讀取各種編碼,腳本在讀取檔案時首先嘗試UTF-8編碼,若失敗則依序嘗試其他常見編碼(如CP950、Shift-JIS、GB18030)。這種方法可以大大提高腳本的兼容性,適應不同語言的字幕檔案。
腳本通過處理不同的編碼,實現了對中文、英文及日文字幕的支援。無論字幕文本中包含哪種語言,腳本都能夠正確解析、統計及處理重複的字幕行,從而提高字幕檔案的質量和一致性。
腳本的核心之一是與用戶的互動,提供靈活的選擇來刪除或保留重複的字幕。當腳本識別到重複的字幕行時,會顯示字幕文本及其出現次數,並提示用戶進行選擇。以下是交互流程的詳細步驟:
process_srt.py
。python process_srt.py
如果腳本顯示「無法識別檔案編碼」,請確認您的.srt檔案是否使用了不在腳本嘗試範圍內的編碼。您可以手動指定檔案的編碼,或者使用文本編輯器轉換檔案編碼至UTF-8。
腳本已經包含刪除None
值的過程,確保最終的字幕列表中不包含被刪除的字幕行。然而,如果出現空白段落,建議檢查腳本是否正確排除None
值,或手動清理輸出的.srt檔案。
腳本支援多種編碼格式,但如果字幕檔案中同時包含多種語言,建議先確保檔案的編碼一致。此外,腳本在處理時不區分語言,僅基於字幕文本進行統計與處理。
假設有一個名為example.srt
的字幕檔案,內容如下:
1
00:00:01,000 --> 00:00:04,000
你好,歡迎觀看本影片。
2
00:00:05,000 --> 00:00:07,000
Thank you for watching this video.
3
00:00:08,000 --> 00:00:10,000
ありがとう、動画をご覧いただきありがとうございます。
4
00:00:11,000 --> 00:00:13,000
你好,歡迎觀看本影片。
5
00:00:14,000 --> 00:00:16,000
Thank you for watching this video.
執行腳本後,腳本會識別出「你好,歡迎觀看本影片。」和「Thank you for watching this video.」各出現兩次,並詢問是否刪除這些重複字幕。根據用戶的選擇,最終生成的example_new.srt
將只保留一次每個重複的字幕行。
通過上述Python腳本,您可以高效地管理.srt字幕檔案中的重複字幕行,提升字幕檔案的品質和一致性。腳本不僅支援多種語言和編碼,還提供了靈活的用戶互動選項,使得字幕處理過程更加人性化和精確。無論是在影片製作、教育材料編輯,還是個人愛好中,這個工具都能大大提升您的工作效率和字幕品質。