本文目录导读:

这里提供一个批量转换字幕编码的Python脚本,支持多种编码格式互转:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量转换字幕文件编码格式
支持 .srt, .ass, .ssa, .sub 等常见字幕格式
"""
import os
import sys
import argparse
from pathlib import Path
import chardet
# 常见字幕编码格式
ENCODINGS = [
'utf-8', 'utf-8-sig', 'utf-16', 'utf-16-le', 'utf-16-be',
'gbk', 'gb2312', 'gb18030',
'big5', 'big5hkscs',
'shift_jis', 'euc-jp',
'euc-kr',
'latin-1', 'iso-8859-1',
'cp1252', 'cp1251', 'cp1250'
]
def detect_encoding(file_path, max_bytes=100000):
"""
检测文件编码
"""
with open(file_path, 'rb') as f:
raw_data = f.read(max_bytes)
result = chardet.detect(raw_data)
encoding = result['encoding']
confidence = result['confidence']
if encoding is None:
return None, 0
# 规范化编码名称
encoding = encoding.lower()
if encoding in ['ascii', 'ansi']:
return 'utf-8', confidence
elif encoding == 'iso-8859-1':
return 'latin-1', confidence
return encoding, confidence
def convert_file(file_path, target_encoding='utf-8', source_encoding=None, backup=True):
"""
转换单个字幕文件编码
"""
try:
# 检测原编码
if source_encoding is None:
source_encoding, confidence = detect_encoding(file_path)
if source_encoding is None:
print(f"⚠ 无法检测编码: {file_path}")
return False
print(f" 检测到编码: {source_encoding} (置信度: {confidence:.1%})")
# 读取文件
with open(file_path, 'rb') as f:
raw_data = f.read()
# 解码
try:
text = raw_data.decode(source_encoding)
except UnicodeDecodeError:
print(f"✗ 解码失败: {file_path} (编码: {source_encoding})")
return False
# 检查是否需要转换
if source_encoding.lower() == target_encoding.lower():
print(f" 无需转换: {file_path}")
return True
# 备份原文件
if backup:
backup_path = file_path.with_suffix(file_path.suffix + '.bak')
if not backup_path.exists():
file_path.rename(backup_path)
print(f" 备份原文件: {backup_path.name}")
# 写入目标编码
with open(file_path, 'w', encoding=target_encoding) as f:
f.write(text)
print(f"✓ 转换成功: {file_path} -> {target_encoding}")
return True
except Exception as e:
print(f"✗ 转换失败: {file_path}")
print(f" 错误: {str(e)}")
return False
def batch_convert(input_path, target_encoding='utf-8', source_encoding=None,
recursive=False, backup=True, extensions=None):
"""
批量转换字幕文件
"""
if extensions is None:
extensions = ['.srt', '.ass', '.ssa', '.sub', '.smi', '.idx']
path = Path(input_path)
if path.is_file():
# 单个文件
if path.suffix.lower() in extensions:
convert_file(path, target_encoding, source_encoding, backup)
else:
print(f"跳过非字幕文件: {path}")
elif path.is_dir():
# 目录
pattern = '**/*' if recursive else '*'
files = [f for f in path.glob(pattern) if f.is_file() and f.suffix.lower() in extensions]
if not files:
print(f"未找到字幕文件 in {path}")
return
print(f"找到 {len(files)} 个字幕文件")
success = 0
fail = 0
for f in files:
if convert_file(f, target_encoding, source_encoding, backup):
success += 1
else:
fail += 1
print(f"\n完成! 成功: {success}, 失败: {fail}")
else:
print(f"路径不存在: {input_path}")
def list_encodings():
"""列出支持的编码格式"""
print("支持的编码格式:")
for i, enc in enumerate(ENCODINGS, 1):
print(f" {i:2d}. {enc}")
def main():
parser = argparse.ArgumentParser(
description='批量转换字幕文件编码格式',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
示例:
# 转换单个文件为UTF-8
python subtitle_encoding_converter.py input.srt
# 转换目录下所有字幕为UTF-8
python subtitle_encoding_converter.py ./subtitles/
# 递归转换目录及其子目录
python subtitle_encoding_converter.py ./subtitles/ -r
# 指定源编码转换
python subtitle_encoding_converter.py input.srt -s gbk
# 转换到指定目标编码
python subtitle_encoding_converter.py input.srt -t utf-8
# 不备份原文件
python subtitle_encoding_converter.py input.srt -nb
# 列出支持的编码格式
python subtitle_encoding_converter.py -l
"""
)
parser.add_argument('input', nargs='?', help='输入文件或目录路径')
parser.add_argument('-t', '--target', default='utf-8',
help='目标编码 (默认: utf-8)')
parser.add_argument('-s', '--source', default=None,
help='源编码 (默认: 自动检测)')
parser.add_argument('-r', '--recursive', action='store_true',
help='递归处理子目录')
parser.add_argument('-nb', '--no-backup', action='store_true',
help='不备份原文件')
parser.add_argument('-l', '--list-encodings', action='store_true',
help='列出支持的编码格式')
args = parser.parse_args()
if args.list_encodings:
list_encodings()
return
if not args.input:
parser.print_help()
return
batch_convert(
args.input,
target_encoding=args.target,
source_encoding=args.source,
recursive=args.recursive,
backup=not args.no_backup
)
if __name__ == '__main__':
main()
安装依赖
pip install chardet
使用方法
基本使用
# 转换单个文件为UTF-8 python subtitle_converter.py input.srt # 转换目录下所有字幕 python subtitle_converter.py ./subtitles/ # 递归处理子目录 python subtitle_converter.py ./subtitles/ -r
指定编码
# 指定源编码(不自动检测) python subtitle_converter.py input.srt -s gbk # 指定目标编码 python subtitle_converter.py input.srt -t utf-8
其他选项
# 不备份原文件 python subtitle_converter.py input.srt -nb # 查看支持的编码 python subtitle_converter.py -l
Windows 用户快捷用法
创建 convert_all.bat:
@echo off python subtitle_converter.py %1 -r pause
然后拖放文件夹到该批处理文件即可。
功能特点
- 自动编码检测:使用 chardet 自动识别文件编码
- 备份原文件:转换前自动备份(生成 .bak 文件)
- 批量处理:支持目录批量转换
- 递归处理:可处理子目录
- 多种字幕格式:支持 .srt, .ass, .ssa, .sub 等
- 错误处理:显示转换失败的文件及原因
注意事项
- 首次使用建议先备份原始文件
- 自动编码检测不是100%准确,如有问题请手动指定源编码
- 转换大文件时可能需要较长时间
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播