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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 2.7

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

Q&A

解決済

2回答

229閲覧

for文が1行目で停止する

退会済みユーザー

退会済みユーザー

総合スコア0

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 2.7

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

0グッド

0クリップ

投稿2018/10/23 07:24

編集2018/10/23 07:24

sequence.log

1(sequence.log) 2 A PRO 2 3 A GLY 3 4 A SER 4

ATOM2.log

1(ATOM2.log) 2PRO A 2 3PRO A 2 4PRO A 2 5PRO A 2 6PRO A 2 7GLY B 3 8GLY B 3 9GLY A 3 10GLY A 3 11GLY A 3

sequence.logを1行ずつ読んで、ATOM2.logの一致している行を出力するということをしています。
そこで以下のようなスクリプトを作りました。

python

1path = 'sequence.log' 2path2 = 'ATOM2.log' 3 4f = open(path) 5f2 = open(path2) 6 7for line in f: 8 line_chain = line[1:2] #"A"を抜きだし 9 line_num = line[12:13] #"2","3","4"を抜きだし 10 line_res = line[5:8] #"PRO","GLY","SER"を抜きだし 11 if line_chain == "A": 12 for line2 in f2: 13 line_chain2 = line2[4:5] #"A"を抜きだし 14 line_num2 = line2[8:9] #"2","3"を抜きだし 15 line_res2 = line2[0:3] #"PRO","GLY"を抜きだし 16 if (line_res == line_res2) and (line_chain == line_chain2) and (line_num == line_num2): 17 fileobj = open ("a.log", "a") 18 print >> fileobj, line2.rstrip() 19
得たい結果 (a.log) PRO A 2 PRO A 2 PRO A 2 PRO A 2 PRO A 2 GLY A 3 GLY A 3 GLY A 3

実際に動かしてみると

PRO A 2 PRO A 2 PRO A 2 PRO A 2 PRO A 2

しか出力されません。
for文の中にfor文をいれているため、for line in f:で1行だけ回して止まっているのではないかと考えています。
これを2行目以降も続けるにはどう書き変えればいいのでしょうか。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

for line2 in f2:が1回目のループでファイルが閉じているのが原因かもしれません。

python

1f = open(path).readlines() 2f2 = open(path2).readlines()

このように、最初に全て読み出してから処理を行ってみてはいかがでしょうか。

投稿2018/10/23 08:29

suzu6

総合スコア168

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

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

退会済みユーザー

退会済みユーザー

2018/10/23 08:38

うまくいきました! ありがとうございます。
suzu6

2018/10/23 08:45

よかったです。 アミノ酸の解析ですかね。頑張ってください。 質問とは異なりますが、sprit()を使うと簡潔になります。 ``` for line in file: chain, num, res = line.strip().split() print(chain, num, res) ```
退会済みユーザー

退会済みユーザー

2018/10/23 08:48

そんな手段もあるのですね。 参考にさせていただきます。
guest

0

line[1:2]ですが、Aの後の空白を抜き出していたりしませんか?
デバッグ機能を使って、行ごとに、変数が自分の想定する値をとっているかを確認するといいと思いますよ。

python

1path = 'sequence.log' 2path2 = 'ATOM2.log' 3 4f = open(path) 5f2 = open(path2) 6 7for line in f: 8 line_chain = line[1:2] #"A"を抜きだし #ココ!!!!!!!!!!!!!!!!

投稿2018/10/23 08:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/10/23 08:19

回答ありがとうございます。 確認しましたが、想定どおりの値をとっていました。
退会済みユーザー

退会済みユーザー

2018/10/23 08:21 編集

こちらを参考にする限り、line[0:1]とすべきでは?まちがっていたらごめんなさい。 https://www.javadrive.jp/python/string/index11.html あと、想定外の値をとっているので、おかしな挙動になっているのだと思いますよ。
退会済みユーザー

退会済みユーザー

2018/10/23 08:23

sequence.logのAの前に半角一文字分空白があるので、line[1:2]としています。 ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/10/23 08:25 編集

なるほどそうでしたか、ごめんなさい。ちなみに、想定外の値を取っているというのは、line[1:2]の場所以外についても言及してのことですのでお間違いなく。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問