
你是否曾經需要從 .srt 字幕檔案中提取純文字內容,卻被惱人的序號、時間軸和空白行打亂?傳統的文字處理方式容易誤刪內容(例如字幕剛好是數字),效率低落。
本文將介紹一個強大且穩健的 Python 腳本,它採用 SRT 檔案的區塊結構分析原理,能夠精準地刪除所有非字幕資訊,完美保留每一句對話。
🎯 腳本核心目標
我們的 Python 腳本將實現以下功能:
- 讀取使用者指定的外部
.srt檔案。 - 精準識別並移除 SRT 檔案中每一組的:
- ❌ 序號行 (例如:
1,2) - ❌ 時間軸行 (例如:
00:00:02,680 --> 00:00:04,360) - ❌ 所有多餘的空白行。
- ❌ 序號行 (例如:
- 保留所有字幕內容,即使字幕是純數字也不會誤刪。
- 將提取出的純文字內容輸出到終端機或指定的新
.txt檔案。
🛠️ 第一步:準備工作
1. 安裝 Python (如果尚未安裝)
請確保你的電腦已經安裝了 Python 3 環境。你可以從 Python 官網 下載並安裝。
2. 儲存腳本
將以下程式碼儲存為一個檔案,命名為 srt_to_text.py。
Python
import os
import re
import sys
def extract_subtitles_by_block(input_filepath, output_filepath=None):
"""
讀取一個 .srt 檔案,使用區塊分析模式,精準提取字幕內容。
"""
if not os.path.exists(input_filepath):
print(f"❌ 錯誤: 找不到檔案 {input_filepath}")
return [] if output_filepath is None else None
if not input_filepath.lower().endswith('.srt'):
print(f"⚠️ 警告: 檔案 {input_filepath} 似乎不是 .srt 格式。")
try:
# 1. 讀取整個檔案內容
with open(input_filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 2. 以兩個連續的換行符分割成獨立的字幕區塊 (\n\n 或 \r\n\r\n)
blocks = re.split(r'\n\s*\n|\r\n\s*\r\n', content.strip())
subtitle_lines = []
for block in blocks:
if not block.strip():
continue
# 將區塊內的行按換行符分割
lines = block.splitlines()
# 依據 SRT 結構,字幕內容從 lines[2] (第三行) 開始
if len(lines) >= 3:
for line in lines[2:]:
stripped_line = line.strip()
# 只添加非空行,處理多行字幕
if stripped_line:
subtitle_lines.append(stripped_line)
except Exception as e:
print(f"❌ 讀取或處理檔案時發生錯誤: {e}")
return [] if output_filepath is None else None
# 處理輸出
if output_filepath:
try:
with open(output_filepath, 'w', encoding='utf-8') as outfile:
outfile.write('\n'.join(subtitle_lines))
print(f"✅ 成功提取字幕並儲存至:{output_filepath}")
return None
except Exception as e:
print(f"❌ 寫入檔案時發生錯誤: {e}")
return subtitle_lines
else:
return subtitle_lines
def main():
# 檢查命令行參數
if len(sys.argv) < 2:
print("💡 使用方式:")
print(f" python {sys.argv[0]} <輸入的.srt檔案路徑> [輸出的.txt檔案路徑]")
print("\n範例:")
print(f" python {sys.argv[0]} my_video.srt")
print(f" python {sys.argv[0]} my_video.srt output.txt")
return
input_file = sys.argv[1]
output_file = None
if len(sys.argv) > 2:
output_file = sys.argv[2]
print(f"🚀 正在處理檔案: {input_file}")
if output_file:
extract_subtitles_by_block(input_file, output_file)
else:
subtitles_list = extract_subtitles_by_block(input_file)
if subtitles_list:
print("\n--- 提取出的字幕內容 ---")
print("\n".join(subtitles_list))
print("--------------------------")
elif subtitles_list is not None:
print("⚠️ 提取結果為空,請檢查 .srt 檔案內容。")
if __name__ == '__main__':
main()
💻 第二步:執行腳本
打開你的命令提示字元 (Windows) 或終端機 (macOS/Linux),導航到你存放 srt_to_text.py 的目錄。
方式一:列印到終端機 (快速檢視)
如果你只是想快速查看提取出的純文字內容,不需要存檔,則只提供 SRT 檔案路徑。
- 命令格式:
python srt_to_text.py <你的 SRT 檔案名>
Bash
# 假設你的字幕檔名為 my_episode.srt
python srt_to_text.py my_episode.srt
結果輸出:
🚀 正在處理檔案: my_episode.srt
--- 提取出的字幕內容 ---
放棄台積電的主管
轉到這個跑道上來
那個心中的掙扎應該是蠻大的吧
--------------------------
方式二:儲存到純文字檔案 (永久存檔)
如果你想將結果儲存為一個新的 .txt 檔案,請在命令後加上你想要的輸出檔名。
- 命令格式:
python srt_to_text.py <輸入 SRT 檔案名> <輸出 TXT 檔案名>
Bash
# 將 my_episode.srt 的結果儲存到 script_output.txt
python srt_to_text.py my_episode.srt script_output.txt
結果輸出:
🚀 正在處理檔案: my_episode.srt
✅ 成功提取字幕並儲存至:script_output.txt
深入理解:腳本為何如此穩健?
這個腳本的精妙之處在於它不依賴內容猜測,而是利用 SRT 檔案的固定格式:
| 行號 | 內容類型 | 腳本處理 |
| 1 | 序號 (例如 1) | 忽略 (這是區塊中的第一行) |
| 2 | 時間軸 (例如 00:00 --> ...) | 忽略 (這是區塊中的第二行) |
| 3 | 字幕內容 | 保留 |
| 4+ | 額外的字幕內容 (多行) | 保留 |
透過先用空行將整個檔案切割成獨立的「字幕區塊」,再針對每個區塊,我們只需要跳過前兩行,就能確保抓取到的永遠是正確的字幕文字,完美解決了字幕內容剛好是純數字所導致的誤刪問題。
現在,你可以輕鬆、快速且精準地將任何 .srt 字幕文件轉換為乾淨的純文字稿了!
