見出し画像

退屈なことをPythonにやってもらうための演習の回答[8.10.2]

白地です。

ちょっと間があいてしまいました。やってはいたのですが、うまくいかずドツボにハマってしまったので、とりあえず「例なら通るわこれで」というバージョンにして、次に進みたいと思います。

# 8.10.2 作文ジェネレータ

# 大方針:
# 各単語と、候補になるADJECTIVE, NOUN, VERB, ADVERB をリストに入れておいて、
# 単語リストに上記が出現したらリストを置換する(for ... in ... を使えて便利)

# テキストファイルはどうやって指定するのか?
# →第1引数としてとる
# 新しいファイルはどうやって命名するのか? どこに保存するのか?
# →元のファイル名に _replaced と付けて、元のテキストファイルと同一フォルダに保存する

import sys
import os
import re

# テキストファイルを読み込む

# 第1引数を見る
try:
    filepath = sys.argv[1]
except IndexError:
    print('Please specify the file you want to convert to argument.')
    sys.exit(1)

# 最低限のエラー処理
if os.path.isfile(filepath)==False :
    print('Please specify the file.')
    sys.exit(1)

scr_file = open(filepath)

# 改行も読み込みたいので、readlinesで読む
souruce_content = scr_file.readlines()

scr_file.close()

# まず半角スペースで区切ってリストに入れる
tmp = []

for i in range(len(souruce_content)):
    tmp = tmp + souruce_content[i].split(' ')

# 記号があったら分割する
# http://www.megasoft.co.jp/mifes/seiki/meta.html

# リストの中で、前と後ろに記号が出現したらそれを分割する
# TODO:短縮形が最後に来たときの処理
# TODO:単語の頭に記号が来たときの処理が不十分
regex = re.compile(r'^\W|\W$')
regex_pre = re.compile(r'^\W*')
regex_body = re.compile(r'\w+')
regex_ter = re.compile(r'\W*$')

for i in range(len(tmp)):

    # 初期化
    j = 0

    if ( regex.search(tmp[i]) != None ) and ( regex_body.search(tmp[i]) != None ) :

        #分割して消す 
        pre = regex_pre.search(tmp[i])
        body = regex_body.search(tmp[i])
        ter = regex_ter.search(tmp[i])

        del tmp[i]

        if ( pre.start() != pre.end() ):
            tmp.insert(i+j,pre.group())
            j = j + 1

        if ( body.start() != body.end() ):
            tmp.insert(i+j,body.group())
            j = j + 1

        if ( ter.start() != ter.end() ):
            tmp.insert(i+j,ter.group())
            j = j + 1
        
# ADJECTIVE, NOUN, VERB, ADVERB を 出た順に input を出して置換する
target = ['ADJECTIVE', 'NOUN', 'VERB', 'ADVERB']

# 入力された文字が半角英数字か確認する
for i in range(len(tmp)):
    if tmp[i] in target:
#        print('Enter an ' + tmp[i].lower() + ':')
#        tmp_input = input()
#        tmp[i] = tmp_input

        while True:
            print('Enter an ' + tmp[i].lower() + ':')

            tmp_input = input()

            check = tmp_input.isalnum
            
            if (check == False):
                print('Input an English word.')
                continue
            else:
                tmp[i] = tmp_input
                break

# 表示用に結合
# TODO:単語の頭に記号が来たときの処理が不十分
insert_text = ' '.join(tmp)
insert_text = re.sub(r'\n ', r'\n', insert_text)
insert_text = re.sub(r' (\W)',r'\1', insert_text)

# 表示
print(insert_text)

# ファイルに保存

# ファイル名を生成
# .から始まるファイルはうまく動かないはずだがもう気にしない
# https://docs.python.jp/3/library/os.path.html
filename = os.path.basename(filepath)
new_filename_base = os.path.splitext(filename)
new_filename = new_filename_base[0] + '_replace' + new_filename_base[1]

# ファイルを作成
dst_file = open( new_filename, 'w')

dst_file.write(insert_text)

dst_file.close()

方針が間違っていたのでしょうか… 途中から英文の形態素解析に近いようなことをしなければいけないのか!?という気持ちになって、放り投げました…

色々と場合分けすればいけるのかもしれないですが、章タイトルである「ファイルの読み書き」ではないところで詰まっていたので、脇に置いていきます。

今回から多少コメントを入れるようにしました。自分のコードであっても、あとから見たら他人のコードですもんね。

Pythonをやりながら、実践GAS!みたいなのも進めたほうが、業務ハッカーらしいですよね。がんばります。

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