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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1160閲覧

For文で取得した値について

polpop

総合スコア6

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/07/25 13:25

編集2020/07/25 14:00

#実現したいこと

1 .txtファイルAとBから"Ask"を含む行番号を抽出 
2 .txtファイルAとBから"nest"を含む行番号を抽出
3 .上記で取得した値を保持しfor文で更なる処理を行いたい。
(上記で抽出した値の間の行をテキストファイルに抽出したいと思っています。)

#A.txtの中身 ASK test test nest #B.txt test ASK test ASK nest

問題
以下のスクリプト内で最初にfor 文で取得した"Ask"を含む行番号が"nest"の行番号を取得する処理の後に値が変わってしまいます。

どうしたら"nest"を含む文字列の行番号を取得した後に、その前で取得したASKの値を保持し、次の処理を行う事ができるでしょうか?

ご回答いただけますと幸いです。

#試した事

import glob report = glob.glob('*.txt')#複数のファイルを読み込む ######ASKを含む行で最初に該当した物を出力###### for m in report: with open(m, encoding="utf-8") as fin: for row1, text1 in enumerate(fin, start=1): text1 = text1.rstrip() if "Ask" in text1: break print(row1) #1回目 "1","2"と出力 ######nestを含む行で最初に該当した物を出力###### for i in report: with open(i, encoding="utf-8") as fin2: for row2, text2 in enumerate(fin2, start=1): text2 = text2.rstrip() if "nest" in text2: break print(row1) #2回目"2"と出力 (1回目で取得した値と内容が異なる) # print(row2) # "4","5"と出力 for x in range(row1,row2): #上記で取得した行番号を元に更なるfor文での処理を行う

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

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

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

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

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

guest

回答1

0

ベストアンサー

for内の一時変数であるrow1,row2の値を保存していないのだからそうなります。
グローバル変数に配列でも用意して保存すればよいのでは?
また「変わっている」といっていますが、一回目の最後の出力"2"が2回目にも"2"と出力されているので「変わって」いませんよ。
抽出と言っていますが、ASKの抽出で、B.txtの4行目は拾われていませんが、それで問題ないんですかね?

コード例追記(もっと簡潔に表す方法はあるかと思いますが)

python

1import glob 2report = glob.glob('*.txt')#複数のファイルを読み込む 3 4#listALL =[] #ループ外で再利用する場合 5 6######ファイル毎にループ###### 7for m in report: 8 with open(m, encoding="utf-8") as fin: 9 start =-1 #ASKの位置 10 end =-1 #nestの位置 11 list=[] #結果出力用リスト 12 13 for row1, text1 in enumerate(fin, start=1): 14 text1 = text1.rstrip() 15 list.append(text1) 16 17 if "Ask" in text1: 18 if start=-1: #startが初期値の場合 19 start=row1-1 #startを更新 20 if "nest" in text1: 21 end=row1 22 23 #エラー処理 24 #ASK,nestが見つからないもしくはnestのあとにASKが来る場合 25 if (start == -1) or (end == -1) or (start > end): 26 print("error") #エラー出力してそのファイルは飛ばす。 27 continue 28 29 list=list[start:end] 30 print(list) #このへんで処理 31 32 #listAll.append(list) #ループ外で再利用する場合 33 34#print(listAll) #ループ外で再利用する場合 35##このへんで処理 36 37##出力 38#['Ask', 'test', 'test', 'nest'] #ループ1周目(A.txt) 39#['Ask', 'test', 'Ask', 'nest'] #ループ2周目(B.txt) 40#[['Ask', 'test', 'test', 'nest'], ['Ask', 'test', 'Ask', 'nest']] #listAllを出力した場合 41 42

投稿2020/07/25 14:15

編集2020/07/25 15:52
Kaleidoscope

総合スコア257

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

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

polpop

2020/07/25 14:32

Kaleidoscopeさん ご回答いただきありがとうございます。 プログラミング初心者の為、初歩的な質問で申し訳ないです。 >>グローバル変数に配列でも用意して保存すればよいのでは? そのような事ができるんですね。ちょっと試してみます。 >>抽出と言っていますが、ASKの抽出で、B.txtの4行目は拾われていませんが、それで問題ないんですかね? 問題ないです。実現したい処理は指定した行頭と行末の行番号を取得しその間の行をすべて抽出する処理を行い為です。
Kaleidoscope

2020/07/25 14:38

>実現したい処理は指定した行頭と行末の行番号を取得しその間の行をすべて抽出する処理を行い為です。 それであればAのASK,BのASK、AのNEST、BのNESTと処理していくより、 AのASK,AのNESTまで処理して、その間の行の抽出までおこなったあと、Bの処理をしたほうがいいのでは?
polpop

2020/07/25 15:00 編集

一つの処理にするには具体的にどうすればいいのでしょうか? コードですが、最初にhitした"ASK"を含む文字列を含む行の行番号を抽出したい為、break処理を行っています。 breakを行わず、最初にヒットした物を抽出し、つぎのfor文処理(nestを含む行番号取得)の処理を行う事はできるのでしょうか?
Kaleidoscope

2020/07/25 15:55

コード例追記しました。 リストにAsk,nestは含んでますが、含まないほうが良ければ list=list[start+1:end-1] 等としてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問