python#2.5 ルビ振り機ver2

 みんはやに倣ったルビ振りプログラムです。ver1からの変更点は、8行目で pAll を設定し、for row in f: ブロックの最後の方 (num_listC = []以下) を追加することで、記号を入れないようにした点です。

from pykakasi import kakasi
import regex
import tkinter as tk
import tkinter.filedialog
# 文字種 (ひらがな, 漢字) を判別するメソッド
pHira = regex.compile(r'\p{Script=Hiragana}+')
pKanji = regex.compile(r'\p{Script=Han}+')
pAll = regex.compile(r'[\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Han}ーa-zA-Z0-9]+')
# 漢字をひらがなに直すメソッド
kakasi = kakasi()
kakasi.setMode('J', 'H')
conv = kakasi.getConverter()

main_results = []
root = tk.Tk()
root.withdraw()
filename = tkinter.filedialog.asksaveasfilename()
root.destroy()
if filename:
   pass
else:
   print('No file specified')
# ファイルを開く
try:
   with open(filename, 'r') as f:
       
       for row in f:
           item = row.rstrip()
           converted_item = ''
           
           # 何文字目が漢字 or ひらがなか? をリストに格納
           num_listA = []
           num_listB = []
           for i in range(len(item)):
               if pHira.match(item[i]) or pKanji.match(item[i]):
                   num_listA.append(i)
               else:
                   num_listB.append(i)
           # item のうち漢字かひらがなの箇所だけ、ひらがなに直す
           if len(num_listA) != 0:
               stringA = item[num_listA[0]]
               # 漢字・ひらがなが連続しているところは一括で変換したい
               if len(num_listA) >= 2:
                   for i in range(len(num_listA)-1):
                       if num_listA[i+1] - num_listA[i] == 1:
                           stringA += item[num_listA[i+1]]
                       else:
                           stringA += ',' + item[num_listA[i+1]]
               list1 = stringA.split(',')
               list2 = []
               for i in range(len(list1)):
                   result = conv.do(list1[i])
                   list2.append(result)
               if len(num_listB) != 0:
                   stringB = item[num_listB[0]]
                   if len(num_listB) >= 2:
                       for i in range(len(num_listB)-1):
                           if num_listB[i+1] - num_listB[i] == 1:
                               stringB += item[num_listB[i+1]]
                           else:
                               stringB += ',' + item[num_listB[i+1]]
                   list3 = stringB.split(',')
                   if 0 in num_listA:
                       if len(list3) < len(list2):
                           list3.append('')
                       for item2, item3 in zip(list2, list3):
                           converted_item += item2 + item3
                   else:
                       if len(list2) < len(list3):
                           list2.append('')
                       for item3, item2 in zip(list3, list2):
                           converted_item += item3 + item2
               else:
                   for i in range(len(list2)):
                       converted_item += list2[i]
                   
           else:
               converted_item += item
           num_listC = []
           listC = list(converted_item)
           for i in range(len(converted_item)):
               if not(pAll.match(converted_item[i])):
                   num_listC.append(i)
           for i in range(len(num_listC)):
               listC[num_listC[i]] = ''
           new_item = ''.join(listC)
           main_results.append(item + '\t' + new_item)
           print(item + '\t' + new_item)
               
# ファイルを開く時のエラー対応
except IOError:
   print('ファイルを開くことができません')
root = tk.Tk()
root.withdraw()
filename = tkinter.filedialog.asksaveasfilename()
root.destroy()
if filename:
   pass
else:
   print('No file specified')
# ファイルを開く
try:
   with open(filename, 'a') as f:
       for i in range(len(main_results)):
           f.write(main_results[i] + '\n')
           
# ファイルを開く時のエラー対応
except IOError:
   print('ファイルを開くことができません')


この記事が気に入ったらサポートをしてみませんか?