• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:行き詰ってます。。)

Pythonプログラミングでファイルを検索する方法

このQ&Aのポイント
  • Pythonのファイル操作で、指定したファイルをオープンし、キーワードを検索する方法について解説します。
  • ファイルを読み込み、改行を削除した後、指定したキーワードを検索します。一致する文字の位置が分かった後は、特定のパターンで次々と文字を取得していきます。
  • AとBの特定のパターンで文字を取得するプログラムを作成する方法についてご教示ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6849/9743)
回答No.5

>読み込むテキストファイルデータは、 (中略) >keywordは、input()で<>内の数値入力を想定してます。 ふむ、そうすると、単純な一重ループで処理するのは少々面倒ですね。 お望みの処理をするのに、いくつかのやり方があります。 ●方法1 入力された数字文字列(例:「100」なら「<100>」の行)を見つけるまで、読み飛ばす(行を読むだけで何もしない)。 該当行を見つけたら、次の処理に進む。 次の処理(ループ): 一行読んで、先頭文字が「<」でなければ、出力する。 「<」が出てきたら終了。 万が一、ファイル終端に達してしまったら、強制終了。 ●方法2 「見つけた」フラグ(変数) find=0 にしておく。 処理ループ: 一行読む。ただし読めない(ファイル末)ならば終了。 「見つけた」フラグが1のときに、先頭文字が「<」だったら、プログラム終了。そうでなければ、出力する。 先頭文字が「<」だったら、入力と比較して、一致したら「見つけた」フラグを1にする。 (処理ループ先頭へ) ●方法3 「<xxx>」から、次の「<xxx>」までの間を一気に読み込み、保持しておく。 「<xxx>」が入力値と一致すれば、読み込んだ数行を出力して終了。 そうでなければ破棄し、次のブロックを読みに行く。 ---- こんな感じでしょうか。 どの方法でも、結果は得られるでしょう。 なお、あなたの考えていたこちらの部分、 >Bを検出したら終わり。というプログラムを記載したいのですが、 サンプルデータでは、B で終わっていないブロックがあります。そのため、あなたの想定したプログラムをそのまま組んでしまうと、一度該当部を見つけた後、延々とデータを出力し続け、次に先頭Bが見つかるまで(あるいはファイル末まで)止まらないという動作をしてしまうでしょう。 なので上記では、「<xxx>」が処理したい区切りだ、という考えにしました。 どの方法も多少長くなるでしょうけど、組んでみてください。 まあ「方法1」が一番単純かと思います。 「方法2」はフラグ管理が面倒ですが、短くはなるでしょう。(でも極端に短いプログラムは読みにくい(理解しにくい)ことも多く、短さにこだわる必要はありません。) 「方法3」は、複数行の保持に「リスト」を使うと良いかもしれません。それはそれでプログラミングの練習になります。

the-man
質問者

お礼

誠に、ありがとうございます。 方法1で考えてみたいと思ってます。 が、先頭が必ず<とならない場合もあるのですが、100は確定です。 その場合は、findallを使うのでしょうか?? それとも、適した関数があるのでしょうか?

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.4

> #これだとループを抜けれないのが不明・・・。 何故私の書いた回答を無視するのでしょうか? #while True: # print(lines_strip) # if (lines_strip == "B"): #これだとループを抜けれないのが不明・・・。 # break ↑は、一体何を目的としたコードでしょうか?全く意味不明です。 > ここにpositionが10以降という何かがいると思ってます。 「positionが10以降」というのは、質問文中に何も書かれていないのですが、どういう意味なんでしょうか?10以降なら何??

the-man
質問者

お礼

ご回答が遅くなり申し訳ありません。

the-man
質問者

補足

読み込んだテキストデータから、keywordと一致した箇所のデータだけを抽出して表示したいと考えています。 keywordと一致した箇所の要素をlines_strip[10]と想定しました。 説明不足で誠に申し訳ありません。

回答No.3

文字列の先頭を比較したいのであれば、startswithを使うべきかと。

the-man
質問者

お礼

当初、startswithで考えていましたが、やりたいことを実現することに 沿わないのかなと思い、使用をやめました。 ありがとうございます。

  • asciiz
  • ベストアンサー率70% (6849/9743)
回答No.2

うーん、読み込むファイルはどんなデータなのでしょうか? そしてkeywordとして、どんな入力をしていますか? ># if (lines_strip == "B"): #これだとループを抜けれないのが不明・・・。 ここの疑問からすると、「文字列の先頭文字で判別したい」という話でしょうか。 lines_strip には、例えば、"B zzz" という文字列が入ってるんですから、"B" とは一致しません。 なのでループ脱出できません。 ここで、pythonには、部分文字列を取り出す方法があります。 正確に言うと、リスト(配列)の一部分を取り出す書き方です。 > リスト値 [ 開始インデックス : 終了インデックス+1 ] これを例えば、"abcdefg" という文字列で使うと、"abcdefg"[2:5] と書いたとき、インデックス2の"c"から、インデックス4の"e"までを取り出した"cde"という文字列になります。※インデックス番号は0が先頭であることに注意 なので先頭文字で判別したい場合、 if (lines_strip[0:1] == "B"): こんな風に書けばループ脱出できるのではないかと。

the-man
質問者

補足

うーん、読み込むファイルはどんなデータなのでしょうか? そしてkeywordとして、どんな入力をしていますか? ⇒読み込むファイルは、テキストファイルを想定してます。  読み込むテキストファイルデータは、 <100>  A xxx  A ddd  A ccc  A vvv  B zzz <200>  A xx1  A dd1  A cc1  A vv1  A zz1 <300>  A 3xx  A 3dd  A 3cc  A 3vv  A 3zz  keywordは、input()で<>内の数値入力を想定してます。

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.1

while True: でループにして、if keyword == "B": で breakする。

the-man
質問者

補足

別のスレを立てるべきかもしれませんが、 position = lines_strip.find(keyword) #ここでpositionが10とします。 ’’’ ここにpositionが10以降という何かがいると思ってます。 ’’’ #while True: # print(lines_strip) # if (lines_strip == "B"): #これだとループを抜けれないのが不明・・・。 # break 中々、難しく困ってます。。