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

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

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

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

Q&A

解決済

2回答

351閲覧

2つの別のファイルから辞書型を作るにはどうすればいいでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/10/19 01:29

前提・実現したいこと

2つの別のファイルから辞書型を作りたいです。
例えば、
file1 = (ID1 ,ID2, ID3)
file2 = (AAA,BBB,CCC)
という2つの別ファイルがあったとき、
辞書型を作成して
ID1:AAA
ID2:BBB
ID3:CCC
のような出力結果を得たいです。

該当のソースコード

Python

1f = open('file','r') 2 3for i in f: 4 if ">" in i: 5 print(i[4:10]) #これがfile1です 6 7for line in f: 8 if '>' not in line: 9 print(line) #これがfile2です

試したこと

文字列を辞書型にするために、文字列をリスト型に変換して、
辞書型に変換しようとしましたがエラーが表示されてしまいます。

補足情報(FW/ツールのバージョンなど)

Visual Studio Codeを使っています。

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

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

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

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

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

ozwk

2021/10/19 01:37

「2つのファイル」とありますが、コードは'file'の1つだけです。どういうことでしょうか?
etherbeg

2021/10/19 01:43 編集

> エラーが表示されてしまいます 実際に使用したコードとエラーの全文を質問文中に記載してください。
退会済みユーザー

退会済みユーザー

2021/10/19 01:42

> 例えば、 > file1 = (ID1 ,ID2, ID3) > file2 = (AAA,BBB,CCC) > という2つの別ファイルがあったとき、 という4行ですが、なんだろう、文学的といいますか、とても不穏な気持ちにさせられます。ディストピア小説の書き出しを読むようでワクワクしてしまいます。期待しています。
ppaul

2021/10/19 02:04

不穏な気持ち ≒ ワクワク なのですか。面白い感性ですね。
退会済みユーザー

退会済みユーザー

2021/10/19 02:10

@ozak 様 fileというのはおおもとのfileでしてこのfileから抽出したデータをfile1、file2に格納してこの格納したデータがfile1、file2です。言葉足らずで申し訳ございません。 @etherbag様 import re f = open('uniprot_sprot.fasta','r') for i in f: if ">" in i: q = (list(i[4:10])) for line in f: if '>' not in line: p = (list(line)) print(dict(zip(q,p))) と実行した時、 print(dict(zip(q,p))) NameError: name 'p' is not defined というエラーが出てしまいます。 @kilesa様 どのように書けばいいのか分からなくて考えた結果、このような形で記載しました。分かりにくくて申し訳ございません。
ppaul

2021/10/19 03:56

プログラミングは、基礎勉強をしないで難しいことをやっても上達しません。 まず入門書を読みましょう。私はPythonに関する書籍を読んだことがないのでよくわかりませんが、オライリーの【Python】入門Python3 第2版だとハズレではないと思います。
退会済みユーザー

退会済みユーザー

2021/10/19 04:36

@ppaul様 プログラミングの動画を一通り見たので基礎勉強は終了したものだと思っていました。紹介してくださった本、目を通してみます。ご丁寧にありがとうございます。
etherbeg

2021/10/20 09:11

問題が解決したら質問のステータスを「受付中」から「解決済」に変更していただきますようお願いします。できたらベストアンサーも選んで、どの回答で問題が解決したかを分かるようにしてください。
退会済みユーザー

退会済みユーザー

2021/10/20 09:56

@etherbag様、ご親切にありがとうございます。
guest

回答2

0

ベストアンサー

1つのファイルから読み込んでいるようですね。
一度リストに読み出して2回走査する方法

Python

1def conv_to_dict(fname): 2 with open(fname,'r') as fo: 3 lines = fo.readlines() 4 key = [s[4:10].strip() for s in lines if '>' in s] 5 val = [s.strip() for s in lines if '>' not in s] 6 return dict(zip(key, val)) 7 8dic = conv_to_dict('file_name') 9print(dic)

1回だけ読み出す方法(key value が区別が付くように読み出して使う)

Python

1def conv_to_dict(fname): 2 with open(fname,'r') as fo: 3 info = sorted((0, s[4:10].strip()) if '>' in s else (1, s.strip()) for s in fo) 4 return dict(zip(map(lambda x: x[1], info[:len(info)//2]), 5 map(lambda x: x[1], info[len(info)//2:]))) 6 7dic = conv_to_dict('file_name') 8print(dic)

もし、元のファイルに1行ずつ key と value にするデータが交互にあるのであれば

Python

1def conv_to_dict(fname): 2 with open(fname,'r') as fo: 3 return {k[4:10].strip():v.strip() for k,v in zip(fo,fo)} 4 5dic = conv_to_dict('file_name') 6print(dic)

とできます。

投稿2021/10/19 06:18

lehshell

総合スコア1156

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

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

退会済みユーザー

退会済みユーザー

2021/10/19 07:52

ご回答ありがとうございます。せっかく回答してくださったのにもう一度質問するのは恐縮ですがfnameとはどのような意味なのでしょうか? 書いてくださったコードの通りにコードしてみたのですが以下のようなエラーが出てしまいました。 import re f = open('file','r') def conv_to_dict(fname): with open(fname, 'r') as fo: return{k[4:10].strip():v.strip() for k,v in zip(fo,fo)} dic = conv_to_dict('file_name') print(dic) エラーメッセージ Traceback (most recent call last): File "/home/(個人情報)/(個人情報)/(個人情報)/script3.py", line 3, in <module> Traceback (most recent call last): File "/home/(個人情報)/(個人情報)/(個人情報)/script3.py", line 3, in <module> f = open('file','r') FileNotFoundError: [Errno 2] No such file or directory: 'file'
lehshell

2021/10/19 12:23

> fnameとはどのような意味なのでしょうか? 関数の引数です。関数呼び出し時に指定したファイル名を受け取る変数です。 > 書いてくださったコードの通りにコードしてみた していませんね。 私は import re f = open('file','r') を書いてはいません。 関数をご存じないのですね。 def conv_to_dict(fname): からの3行は関数の定義です。 dic = conv_to_dict('file_name') は関数を呼び出しています。 dic = conv_to_dict('file_name') の file_name を対象のファイル名にしてください。
退会済みユーザー

退会済みユーザー

2021/10/20 00:19

ご丁寧にありがとうございます。関数というのは知りませんでした、勉強不足ですね。初歩的なことばかり聞いて申し訳ございません。
退会済みユーザー

退会済みユーザー

2021/10/20 00:23

正常に出力できました。ありがとうございます。
guest

0

コードとエラーメッセージは質問文に追記してもらった方がいいのですが(またエラーメッセージは全文を記載してもらいたかったのですが)、以下で間違いないでしょうか?

python

1import re 2 3f = open('uniprot_sprot.fasta','r') 4 5for i in f: 6 if ">" in I: 7 q = (list(i[4:10])) 8 9for line in f: 10 if '>' not in line: 11 p = (list(line)) 12 13print(dict(zip(q,p))) 14 15# エラーメッセージ(の一部) 16# print(dict(zip(q,p))) 17# NameError: name 'p' is not defined

"name 'p' is not defined" というエラーは、p = (list(line)) が一度も実行されなかったことを意味します。

上記のコードの場合は、開いたファイルの内容を for i in f ですべて読み出した後に、同じファイルオブジェクトを使って再度 for line in f とファイル内容を読み込もうとしているので、2回目の読み込みは全く行われません(読み込むものがない)。そのために p = (list(line)) も含めその直後のブロックのコードは一度も実行されません。以上が上記エラーの直接の原因です。

投稿2021/10/19 03:52

etherbeg

総合スコア1195

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

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

退会済みユーザー

退会済みユーザー

2021/10/19 04:38

2回目は読み込まれないのですね、、ありがとうございます。もう少し考えてみます。
etherbeg

2021/10/19 05:11

f.close()で一度ファイルを閉じてもう一度読み込めば再度読み込むことはできます(他にも方法はありますが)。しかし「2つの別のファイルから辞書型を作りたい」とのことなので、同じファイルから2回読み込むのはやりたいことではないのではないでしょうか。
退会済みユーザー

退会済みユーザー

2021/10/19 07:46

はい、おっしゃる通り、同じファイルから2回読み込むのはやりたいことではないのですが、1つ目のfor文と2つ目のfor文で書かれている内容は別のファイルで書いたものであり、これらを今回、file1、file2とさせていただきました。 言葉足らずで本当に申し訳ございません。
etherbeg

2021/10/19 09:50

> 1つ目のfor文と2つ目のfor文で書かれている内容は別のファイルで書いたもの プログラムの書かれたファイルが2つあって、1つ目のfor文と2つ目のfor文はそれぞれ別のプログラムファイルに書かれていて、プログラムの実行もそれぞれ別に行っている、ということでしょうか? もしそうであればエラーの原因は上の回答で述べたものではありません。 別々のファイルに書かれたプログラムを適当に一つにまとめたものを示されても正確な回答はできません。 "uniprot_sprot.fasta" というファイル名がありましたが、読み込み対象のファイルはバイオインフォマティクスなどで使われるFASTA形式のファイルでしょうか? そうであれば自分でプログラムを書かなくても目的に叶う既存のプログラムが探せばあると思うのですが。
退会済みユーザー

退会済みユーザー

2021/10/20 00:17

おっしゃる通り、読み込み対象のファイルはFASTA形式のファイルです。大学の課題なのでなるべく自分の力でやってみようと思った次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問