2012年2月22日水曜日

【Python】ファイルを検索して行番号を取得する

Pythonを使ってみたかったので、とりあえず書いてみた。
現在のディレクトリ以下のファイルを検索して、指定の文字列のある行番号を取得する。
なんとなくだけど、いまいちよくわかってない部分があったり。


01import os
02import glob
03 
04 
05def get_filepath(rootpath,term):
06    file_list = []
07    for root,dir,files in os.walk(rootpath):
08        for fname in glob.glob(os.path.join(root,term)):
09            file_list.append(fname)
10    return file_list
11 
12 
13def load_files(file_list):
14    file_set = {}
15    for filepath in file_list:
16        fname = filepath[filepath.rfind("/")+1:len(filepath)]
17        f = open(filepath,"r")
18        file_set.update({fname:f})
19    return file_set
20 
21def close_files(file_set):
22    for f in file_set.values():
23        f.close()
24         
25 
26def get_line_number_with_term(file_set,terms):
27    line_set = {}
28    for name,f in file_set.items():
29        line_number = []
30        count = 0
31        for line in f:
32            if(line.find(terms) != -1):
33                line_number.append(count)
34            count+=1
35        line_set.update({name:line_number})
36    return line_set
37     
38if __name__ == '__main__':
39    curdir = os.getcwd()
40    extention =( "*." + raw_input("[ Enter extention ]:") )
41    pathList = get_filepath(curdir,extention)
42    fileset = load_files(pathList)
43    terms = raw_input("[ Enter terms ]:")
44    lineSet = get_line_number_with_term(fileset,terms)
45    close_files(fileset)
46    print lineSet


実行結果
1bash-3.2$ python hoge.py
2python hoge.py
3[ Enter extention ]:py
4py
5[ Enter terms ]:def
6def
7{'hoge.py': [5, 13, 21, 26]}