見出し画像

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

白地です。

『退屈なことはPythonにやらせよう』演習プロジェクトの8.10.3の、自分なりの解答です。

今回も本題とは別のところで詰まりまくりました。

詰まったところとしては、深い階層のファイルを探すところが詰まりました。再帰関数は言葉だけは知ってたんですが、今回始めて実装してみました。

自分の解答を書いておいてアレなのですが、真似してはいけないと思っています… 確か英語の原典版が無料公開されているはずなので、そこに正しいものがあるのでは?と思っています。全部終わったら見に行きます。

日本語版のGithubをちらっと見たのですが、演習プロジェクトの解答がほとんど書いていなかったので参考になりませんでした。残念です。

#! python3
# 8.10.3 正規表現検索

# 概要
# 正規表現を指定させる(どうやって?)
# →inputでよくない?
# フォルダを指定させる(どうやって?)
# →第一引数
# フォルダ内のtxtファイルを検索してリスト化
# 順次開いて、正規表現にマッチするファイルと行・内容を表示する

import sys
import os
import re

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

#カレントディレクトリ:os.getcwd()
dirpath = os.path.join( os.getcwd(), dirpath )

# ディレクトリかどうかの判定
if os.path.isdir(dirpath)==False :
    print('Please specify the Dir.')
    sys.exit(1)

# 正規表現を指定させる
print('Enter the regular expression you want to search.')
tmp_input = input()

# 正規表現の取り込み。面倒なのでエラーで落とす。
try:
    regex_input = re.compile(tmp_input)
except:
    print('Please enter a correct regular expression.')
    sys.exit(1)

# ファイル→拡張子を見る
# テキストファイルが見つかる→フルパスをリストに入れる
text_filelist = []

# search_textfile関数
# input  : ディレクトリのパス
# output : なし
def search_textfile(input_dirpath):

    global text_filelist

    # リストを全部判定していく
    for i in os.listdir( input_dirpath ):

        tmp_path = os.path.join( input_dirpath, i )

        # フォルダ→もう一度関数を呼ぶ
        if os.path.isdir( tmp_path ):
            search_textfile( tmp_path )

        # ファイル→拡張子がtxt
        else:
            if os.path.splitext(i)[1] == r'.txt':
                text_filelist.append( tmp_path )

    return

search_textfile( dirpath )

if text_filelist == []:
    print('Not found.')
    sys.exit(1)

print('following:')

#テキストファイルを読み込む
for txt in text_filelist:

    scr_file = open(txt)

    source_content = scr_file.readlines()

    scr_file.close()

    for i in source_content:
        text_line = regex_input.search(i)
        if text_line != None:
            line = i.strip()
            print(txt, line)

次の演習、シェルスクリプトで書いたことある気がする…

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