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

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

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

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

Q&A

解決済

1回答

990閲覧

python3:ファイル内の特定文字列があったら処理を分けたい。

ITOMO5963

総合スコア98

Python 3.x

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

0グッド

0クリップ

投稿2020/09/30 12:35

##実現したいこと
(C:\tool\配下)ファイル名を取得し、テキストファイル(test01.txt)を開いて、そのファイル名があったら処理を分けたい。このようなことは可能でしょうか。途中まで検討しました。(????)の部分や全体的にご指摘あれば、お力沿いお願いいたします。

python

1import os 2import pathlib 3 4for JsonConf in glob.glob(r'C:\tool*.json'): 5 FileName = os.path.splitext(os.path.basename(JsonConf))[0] 6 7 with open(test01.txt, 'r') as lists: 8 if ????: 9 print("ファイル名あり") 10 else: 11 print("ファイル名無し"

[C:\tool*]

aaaa.json bbbb.json eeee.json

[test01.txt]

aaa bbbb cccc eeee dddd

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じでしょうか?

python

1import os 2import glob 3 4for json_conf in glob.glob(r'tool/*.json'): 5 file_name = os.path.basename(json_conf) 6 droped_extension = os.path.splitext(file_name)[0] 7 8 with open("test01.txt") as lists: 9 lines = map(lambda x: x.strip(), lists.readlines()) 10 if droped_extension in lines: 11 print(f"{droped_extension}({file_name})はファイル名が記載されいてます") 12 else: 13 print(f"{droped_extension}({file_name})はファイル名が記載されていません")

可能な限り元のコードの構成に近い状態で書いてみました。
ただ上記だと、各JSONファイル名がtest01.txtに記載されているか、という確認のために、各JSONファイルごとにtest01.txtをオープン、全行読み込み、余計な改行の削除、という処理を毎回行ってしまっています。
1回だけやっておけば十分な処理なので、自分なら以下のように書きます。

python

1import os 2import glob 3 4with open("test01.txt") as lists: 5 lines = list(map(lambda x: x.strip(), lists.readlines())) 6 7for json_conf in glob.glob(r'tool/*.json'): 8 file_name = os.path.basename(json_conf) 9 dropped_extension = os.path.splitext(file_name)[0] 10 11 if dropped_extension in lines: 12 print(f"{dropped_extension}({file_name})はファイル名が記載されいてます") 13 else: 14 print(f"{dropped_extension}({file_name})はファイル名が記載されていません")

なお、もしPythonにまだ慣れていなくてmap(lambda...)のところがよく分からん、ということであれば、以下のようにコードを書き直すことも可能ですのでご参考までに。

python

1with open("test01.txt") as lists: 2 # test01.txtの全行を読み込み。 3 lines_work = lists.readlines() 4 lines = list() 5 6 # ただし、各行の末尾には改行コードが含まれているので、それを削除する。 7 # for文で各行毎に処理を回す 8 for line in lines_work: 9 # 各行(文字列)がline変数に渡されるので、strip関数を使って改行コードを削除 10 striped = line.strip() 11 # 結果格納用のlinesに結果を追加 12 lines.append(striped)

投稿2020/09/30 13:12

編集2020/09/30 13:22
saba1024

総合スコア58

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

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

LouiS0616

2020/09/30 13:20

list(map(lambda x: x.strip(), lists.readlines())) は list(map(str.strip, lists)) あるいは [s.strip() for s in lists] で充分かなと思います。 読み込みが遅延されるためちょっとだけ効率的です。 また、後にinで帰属判定することを考えれば、linesはリストではなく集合の方が良さそうです。
ITOMO5963

2020/09/30 13:30

お二人の方、回答いただき大変助けりました。 ありがとうございました。
ITOMO5963

2020/10/01 08:40 編集

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問