質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1497閲覧

カレントディレクトリ配下のテキストファイルの中身を検索したい

ItoM

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/01/29 14:41

#前提・実現したいこと
カレントディレクトリ:C:\Users\user\Desktop\python
このディレクトリには作成したpy fileやtextファイルが複数保存されているが
何で検索しても表示結果がでてこない

path = os.path.join(root,fi)でパスを取得していますが
参照するディレクトリの方法が間違っているなど
何か考えられる原因はありますでしょうか。

#発生している問題
PS C:\Users\user\Desktop\python> python3 .\findtext.py def
PS C:\Users\user\Desktop\python>
”何も表示されない”

#ソースコード

python3

1※findtext.py 2import sys 3import os 4 5if len(sys.argv) <= 1: 6 print("[USAGW]) findtext (keyword)") 7 sys.exit(0) 8 9keyword = sys.argv[1] 10 11for root, dirs, files in os.walk("."): 12 for fi in files: 13 result = [] 14 try: 15 path = os.path.join(root,fi) 16 with open(path,encoding='utf-8') as f: 17 for no, line in enmerate(f): 18 if line.find(keyword) >= 0: 19 line = line.strip() 20 s = "| {0:4}: {1}".format(no+1,line) 21 result.append(s) 22 except: 23 continue 24 25    #resultに結果があれば表示する 26 if len(result) > 0: 27 print("+ file:" + fi) 28 for li in result: 29 print(li) # resultに追加された行を表示

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/01/29 14:50

とりあえず例外発生時にトレースバックを表示されてはいかがですか。
guest

回答2

0

ベストアンサー

作成されたプログラム、力作ですねー。

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

投稿2018/01/29 15:35

編集2018/01/29 17:56
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ItoM

2018/01/30 11:04

ありがとうございます。 Visual Studio Codeを使っているのですが、見落としていましたお恥ずかしい限りです。 修正頂いたコードもじっくり読ませていただきます。
guest

0

× enmerate
○ enumerate

参照するディレクトリの方法が間違っているなど

こんなことは質問するまでもなく、単純なprintデバッグで確認できることですね。

投稿2018/01/29 15:31

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ItoM

2018/01/30 11:10

ありがとうございます。 printデバックでの解決法ありがとうございます。 次に躓いた時には試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問