作成されたプログラム、力作ですねー。
1,enumerateのスペルミス。IDE(統合開発環境)をインストールするとこのミスは防げるかと。
for no, line in enmerate(f):
Python
1for no, line in enumerate(f):
2,exceptで例外を全部握りつぶしています。よってtryの処理内で例外発生時は質問文のように何も表示されません。
except:
continue
Exception で例外を全てcacthするのもあまり良くないのですが。以下のように記述すれば、例外発生時にエラーメッセージが表示されます。
Python
1except Exception as ex:
2 print(ex)
3 continue
3,プログラムに渡された引数を元に処理を行うには標準ライブラリのargparseを使うと便利です。プログラムに渡す引数が足りない時はusageも表示してくれます。
Python
1import argparse
2
3parser = argparse.ArgumentParser()
4parser.add_argument('keyword')
5args = parser.parse_args()
6keyword = args.keyword
4,一つの関数内で処理を行いすぎかと、最初はテストを行いやすいようにある程度処理を分割するほうが良いです。
プログラム内でループを行っている部分があれば、関数化してlist/dictを返すようにしたり、yieldを返す形にしたほうがいいです。
Python
1 path = os.path.join(root,fi)
2 with open(path,encoding='utf-8') as f:
3 for no, line in enumerate(f):
4 if line.find(keyword) >= 0:
5 line = line.strip()
6 s = "| {0:4}: {1}".format(no+1,line)
7 result.append(s)
関数化してlistを返すサンプルコード
Python
1def find_text_file(file_path, keyword):
2 lines = []
3 with open(file_path, encoding='utf-8') as f:
4 for no, line in enumerate(f):
5 if line.find(keyword) >= 0:
6 line = line.strip()
7 s = "| {0:4}: {1}".format(no + 1, line)
8 lines.append(s)
9 return lines
関数の呼び出し側
Python
1result = find_text_file(path, keyword)
以下のソースコードは上記4点を変更したソースコードになります。
Python
1# -*- coding: UTF-8 -*
2import sys
3import os
4import argparse
5
6parser = argparse.ArgumentParser()
7parser.add_argument('keyword')
8args = parser.parse_args()
9keyword = args.keyword
10
11
12def find_text_file(file_path, keyword):
13 lines = []
14 with open(file_path, encoding='utf-8') as f:
15 for no, line in enumerate(f):
16 if line.find(keyword) >= 0:
17 line = line.strip()
18 s = "| {0:4}: {1}".format(no + 1, line)
19 lines.append(s)
20 return lines
21
22
23for root, dirs, files in os.walk("."):
24 for fi in files:
25 result = []
26 try:
27 path = os.path.join(root, fi)
28 result = find_text_file(path, keyword)
29 except Exception as ex:
30 print(ex)
31 continue
32
33 #resultに結果があれば表示する
34 if len(result) > 0:
35 print("+ file:" + fi)
36 for li in result:
37 print(li) # resultに追加された行を表示
38