-
Notifications
You must be signed in to change notification settings - Fork 1
/
FullwidthConverter.py
120 lines (107 loc) · 5.39 KB
/
FullwidthConverter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import os
import traceback
from argparse import RawTextHelpFormatter
from pathlib import Path
from typing import Union
from utils.argparser import MyParser
from utils.logfile import _print, setLogfile, closeLogfile, print
from utils.misc import mkFilepath
VER = 'v1.0.4_halfwidth-sp'
DESCRIPTION = '全角片假名转换器\n' + \
'本程序可以将半角片假名与。 「 」 、 ・等符号转换为全角形式,并将全角数字、空格转换为半角形式\n' + \
'—— ' + VER + ' by 谢耳朵w\n\n' + \
'使用方法:将待转换文件拖放到本程序上即可,也可以使用命令行运行进行更多配置。\n\n' + \
'详细介绍、获取最新版本、提交建议和bug请前往 https://github.com/barryZZJ/SubtitleCleaner'
lookup = {
'1': '1', '2': '2', '3': '3', '4': '4', '5': '5',
'6': '6', '7': '7', '8': '8', '9': '9', '0': '0',
'。': '。', '「': '「', '」': '」', '、': '、', '・': '・', ' ': ' ',
'ガ': 'ガ', 'ギ': 'ギ', 'グ': 'グ', 'ゲ': 'ゲ', 'ゴ': 'ゴ',
'ザ': 'ザ', 'ジ': 'ジ', 'ズ': 'ズ', 'ゼ': 'ゼ', 'ゾ': 'ゾ',
'ダ': 'ダ', 'ヂ': 'ヂ', 'ヅ': 'ヅ', 'デ': 'デ', 'ド': 'ド',
'バ': 'バ', 'ビ': 'ビ', 'ブ': 'ブ', 'ベ': 'ベ', 'ボ': 'ボ',
'パ': 'パ', 'ピ': 'ピ', 'プ': 'プ', 'ペ': 'ペ', 'ポ': 'ポ',
'ァ': 'ァ', 'ィ': 'ィ', 'ゥ': 'ゥ', 'ェ': 'ェ', 'ォ': 'ォ',
'ャ': 'ャ', 'ュ': 'ュ', 'ョ': 'ョ', 'ッ': 'ッ', 'ー': 'ー',
'ア': 'ア', 'イ': 'イ', 'ウ': 'ウ', 'エ': 'エ', 'オ': 'オ',
'カ': 'カ', 'キ': 'キ', 'ク': 'ク', 'ケ': 'ケ', 'コ': 'コ',
'サ': 'サ', 'シ': 'シ', 'ス': 'ス', 'セ': 'セ', 'ソ': 'ソ',
'タ': 'タ', 'チ': 'チ', 'ツ': 'ツ', 'テ': 'テ', 'ト': 'ト',
'ナ': 'ナ', 'ニ': 'ニ', 'ヌ': 'ヌ', 'ネ': 'ネ', 'ノ': 'ノ',
'ハ': 'ハ', 'ヒ': 'ヒ', 'フ': 'フ', 'ヘ': 'ヘ', 'ホ': 'ホ',
'マ': 'マ', 'ミ': 'ミ', 'ム': 'ム', 'メ': 'メ', 'モ': 'モ',
'ヤ': 'ヤ', 'ユ': 'ユ', 'ヨ': 'ヨ',
'ラ': 'ラ', 'リ': 'リ', 'ル': 'ル', 'レ': 'レ', 'ロ': 'ロ',
'ワ': 'ワ', 'ン': 'ン', 'ヲ': 'ヲ',
}
def initparser():
parser = MyParser(description=DESCRIPTION, formatter_class=RawTextHelpFormatter)
parser.add_argument('InputFile', type=str, help='待转换文本文件的路径,仅支持utf-8、GBK编码。')
parser.add_argument('-o', '--output', metavar='OUTFILE', type=str, help='输出文件名,默认为<输入文件名>_out.txt。')
parser.add_argument('-q', '--quit', action='store_true', help='结束后不暂停程序直接退出,方便命令行调用。不加该参数程序结束时会暂停。')
parser.add_argument('--log', action='store_true', help='记录日志,执行结果输出到<输入文件名>_log.txt')
return parser
def convertline(line: str, lookup: dict):
# 日字的数字、全角空格、全角标点符号不能改,可能还是改回查找表,并且额外增加浊音半浊音
# 不能用str.translate,因为带浊音的假名是两个字符
# line = unicodedata.normalize('NFKC', line)
for old, new in lookup.items():
line = line.replace(old, new)
return line
def doconvert(inpath, outpath: Union[str, Path], lookup):
cnter = 0
encodings = ['utf-8-sig', 'gbk']
infile = None
outfile = None
for encoding in encodings:
try:
infile = open(inpath, 'r', encoding=encoding)
outfile = open(outpath, 'w', encoding=encoding)
while line := infile.readline():
nline = convertline(line, lookup)
if nline != line:
cnter += 1
print(line.rstrip('\n'), '->\n\t', nline.rstrip('\n'))
print()
outfile.write(nline)
print('\n完成! 共转换了', cnter, '行,已保存至', str(outpath))
return True
except UnicodeDecodeError:
continue
except Exception as err:
print('\n发生了未知错误!请将下面的报错信息及待转换文件提交到 https://github.com/barryZZJ/SubtitleCleaner/issues\n')
traceback.print_exc()
return False
finally:
if infile:
infile.close()
if outfile:
outfile.close()
print('\n错误!无法识别的文件编码,请将文件转存为UTF8或GBK编码格式再试!')
return False
def main():
parser = initparser()
args = parser.parse_args()
if args.log:
logpath = mkFilepath(args.InputFile, '.txt', '_log')
setLogfile(logpath)
try:
print(DESCRIPTION)
print()
print('正在读取', args.InputFile)
outname = args.output or mkFilepath(args.InputFile, 'txt')
doconvert(args.InputFile, outname, lookup)
print()
except Exception as err:
print(
'\n发生了未知错误!请将下面的报错信息及待转换文件提交到 https://github.com/barryZZJ/SubtitleCleaner/issues')
traceback.print_exc()
finally:
if args.log:
closeLogfile()
_print('日志文件已保存至', str(logpath))
_print()
if not args.quit:
os.system('pause')
if __name__ == '__main__':
main()