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

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

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

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

Q&A

解決済

2回答

1132閲覧

pythonでテキストファイルの中で条件を満たす行を抽出するやり方について

yusuke1818

総合スコア10

Python

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

0グッド

0クリップ

投稿2020/12/17 03:21

編集2020/12/17 03:32

ATOM 2 CA PRO A 4 29.341 -18.244 23.236 1.00112.52 C
ATOM 9 CA LYS A 5 28.103 -17.550 19.692 1.00 91.13 C
ATOM 18 CA PRO A 6 29.134 -14.592 19.578 1.00 63.64 C
ATOM 1605 CA LYS B 5 8.357 5.403 38.590 1.00 58.36 C
ATOM 1614 CA PRO B 6 6.423 2.744 36.650 1.00 49.68 C
ATOM 1621 CA PHE B 7 7.816 1.954 33.187 1.00 42.38 C

上のようなテキストファイルがあったとして、ATOM、CA、Aという文字を含む行(上三行)をすべて抽出したいのですが、下記のようにjupyter notebookでコードを書いてもすべて抽出してしまいます。なにが駄目なのでしょうか。教えてくださいお願いいたします。*pdb3asy.entは上のテキストファイルです。
そして、上から三行を抽出するやり方ではなく、ATOM、CA、Aを含む行の条件で絞り込むやり方でお願いいたします。

自分の予想としてはATOMにもCAにもAが含まれているのでATOMとCAのみで絞り込みをしているのと同じことになっているのはないかと思っています。

path = 'pdb3asy.ent' with open(path) as f: lines = f.readlines() lines_strip = [line.strip() for line in lines] ATOM_CA_A_and = [line for line in lines_strip if (('ATOM' in line) and ('CA' in line) and ('A' in line))] for A_CA in ATOM_CA_A_and: print(A_CA)

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

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

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

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

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

guest

回答2

0

Python

1for l in lines: 2 l=l.split() 3 if l[0] == 'ATOM' and l[2] == 'CA' and l[4] == 'A': 4 print(l)

一つの文字列を配列に変換し、指定の場所に指定の文字が入っているかどうか判別するように変更することで、可能です。

投稿2020/12/17 03:53

norapomu

総合スコア224

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

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

yusuke1818

2020/12/17 04:08

なるほど!そういうのもあるんですね!ありがとうございます!!
yusuke1818

2020/12/17 07:02

重ねて質問させてください。 それらが出来て、 ['ATOM', '2', 'CA', 'PRO', 'A', '4', '29.341', '-18.244', '23.236', '1.00112.52', 'C'] ['ATOM', '9', 'CA', 'LYS', 'A', '5', '28.103', '-17.550', '19.692', '1.00', '91.13', 'C'] ['ATOM', '18', 'CA', 'PRO', 'A', '6', '29.134', '-14.592', '19.578', '1.00', '63.64', 'C'] となったのですが、これはリスト型が1つずつ出来ているのですが、これらを1つの二次元配列のリスト型としてつくりたいのですがそれは出来ますか?
norapomu

2020/12/17 07:14

for l in lines: li.append(l.split()) とすることで可能です。(liは仮でリスト型です) 最初の回答は、 lines に入った文字列を、改行コードを区切りとして l に格納し、それを split を使ってリストとして分けてます。 こちらは、リストとして仕分けるところまでは同じですが、そのリストをさらにリストに追加することで二次元配列を生成してます。 という風に思っているのですが、もしかすると説明間違いや不足があるかもしれません。 かけ離れていることはないと思いますが、自分でも調べていただければと思います。
yusuke1818

2020/12/17 07:19

ありがとうございますそれをはじめの質問の時に書いたコードのどこに書けばよいのでしょうか。 お願い致します。
norapomu

2020/12/17 07:22

それはわからないです。 質問者さんが、どこでどういう風にこの二次元配列を使うのかがそもそもわからないので、答えようがないです。
yusuke1818

2020/12/17 07:24

すいませんありがとうございます。
guest

0

ベストアンサー

自分の予想としてはATOMにもCAにもAが含まれているのでATOMとCAのみで絞り込みをしているのと同じことになっているのはないかと思っています。

そうだと思います。

たとえば

python

1'A' in line

python

1' A ' in line

にするとかどうでしょうか
※ Aの両端に空白を追加

投稿2020/12/17 03:57

編集2020/12/17 03:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yusuke1818

2020/12/17 04:08

簡単にできました!!ありがとうございます!
退会済みユーザー

退会済みユーザー

2020/12/17 04:25

norapomuさんの方が丁寧ですので余裕があればそちらで実装してみてください。 抽出するときは細かく条件を指定するのが無難です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問