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

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

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

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

Python

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

Q&A

4回答

1171閲覧

Pythonによるファイルの基礎的な処理 助けてください!

unagiusagi

総合スコア0

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2020/07/11 09:13

編集2020/07/11 09:53

前提・実現したいこと

普段は生物系の勉強をしておりプログラミングは始めたばかりの初心者中の初心者です。プログラミング用語などもほとんどわかりません。必要があり、次のような内容のファイルをPythonを使って処理しています。
#から始まるタイトル行と、それに続く大小文字のABCDの羅列をワンセットにして、それを繰り返しているだけのファイルです。
以下に書いているのは例であり、実際のファイルの内容とは異なります。
(ファイル例)

#1-9876543

AcddDCBACDcA....

#2-1234567

CbCbDaDDDb.....

#3

.....

この、それぞれの配列について、ABCDの数を大文字小文字を区別せず以下のようにカウントして出力したいのですが、どうしたらよいでしょうか。

(出力の目標例)

#1-9876543 A:20 B:31 C:4 D:7
#2-1234567 A:1 B:23 C:45 D:80

.....

発生している問題・エラーメッセージ

[1]
A:16
a:4
B:17
b:14
C:2
c:2
D:1
d:6
[2]
A:1
a:0
T:21
t:2
C:43
c:2
G:40
g:40
.....
というような出力が帰ってきます。
目標の出力のように、1、改行なしにする.2、タイトル行をそのまま出力したい.([1]の代わりに[#1-9876543])3、大文字と小文字を区別せずまとめ、A,B,C,Dの四つについて数えたい.という三つの要望があります。

該当のソースコード

Python

1file = open("ファイル名").read() 2lines = file.split('\n') 3from collections import Counter 4counts = [] 5last = Counter() 6for line in lines: 7 if line.startswith('#'): 8 if last: 9 counts.append(last) 10 last = Counter() 11 else: 12 last = last + Counter(line) 13counts.append(last) 14for line, count in enumerate(counts): 15 print([line]) 16 for alphabet in ('A', 'a', 'B', 'b', 'C', 'c', 'D', 'd'): 17 print(" {}: {}".format(alphabet, count[alphabet]))

試したこと

ネットで探したコードを試行錯誤してる状態で、上のコードも完全に理解してるとは言えないです。

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

丸三日ほどインターネット中を探しましたが、初心者にはほとんど理解できないものばかりでした。非常に難儀しています。どうかよろしくお願い致します。

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

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

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

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

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

unagiusagi

2020/07/11 09:53

完了しました。ご指摘ありがとうございます。
meg_

2020/07/11 09:58

「丸三日ほどインターネット中を探しましたが、初心者にはほとんど理解できないものばかりでした」とのことですが、どのサイトを見ましたか? どのサイトが理解出来ませんでしたか?(質問者さんの理解度を知るための質問です)
unagiusagi

2020/07/11 10:02

元々は生物関係のファイル(fasta file)なので、英語のウェブサイトで同様の処理をしている質問を直接探しました。pythonは基礎の授業で数週間触れたくらいです。基本的な処理はネットで逐一探しながら行なっているような状況です。
aokikenichi

2020/07/11 10:10

元バイオインフォマティシャンです。 fastaですよね 例示されているものもそうですが #はじまりではなく >はじまりですよね line.startswith('#'): では動かないと思いますが
unagiusagi

2020/07/11 10:15

コメントありがとうございます。 すみません、より回答が集まるようにということで問題を一般化して形式だけ変えて載せたつもりでした。 元の形式で質問し直したほうがいいでしょうか。
meg_

2020/07/11 10:16

Python(による処理)を解説しているサイトを見たというわけではないということでしょうか? 「3、大文字と小文字を区別せずまとめ」については、「Python 大文字 小文字」などでネット検索すれば判定方法等見つかりますので調べましょう。質問者さんのやりたいことを全てまとめて解説している情報を見つけることは難しいので、処理の一つ一つを個別に調べるのがより良い方法だと思います。
unagiusagi

2020/07/11 10:19

コメントありがとうございます。色々と調べているのですが、応用が全くできないもので具体的なコードをかけないでいます。引き続き頑張ってみます。
otn

2020/07/11 11:02

そもそも、Python入門は終えていますか?それとも入門せず、ググってコピペですか?
guest

回答4

0

ファイルの基礎的な処理 助けてください!

とうことですが、ファイルの処理はほぼちゃんと書けています。
ファイルから読んだ後の処理が意味不明です。変数の意味も理解できない。

見出し行とデータ行が交互にあるなら、こんな感じで。

Python

1from collections import Counter 2for line in open("~~~"): 3 line = line.strip() 4 if line.startswith('>#'): 5 print(line,end=" ") 6 else: 7 # Counter表示そのままでいいなら 8 print(Counter(line.upper())) 9 # 文字でソートするなら 10 print(dict(sorted((Counter(line.upper())).items())))

投稿2020/07/11 11:53

otn

総合スコア84499

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

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

0

追記修正依頼にも書きましたが「#から始まるタイトル行」と説明文にあるのに例示されているファイルは「>」でプログラム例では「#」を扱おうとしてます。
fasta形式なら > 、あえて # になさりたいならファイル例も # 始まりとした方が分かりやすいかと

私だったらこうします
Counterを使ってもいいですけどもし、Aが一つもない時にA:0と出なくなるので(まれですけどあり得ますよね)
他の方もご指摘してますが文字列を大文字か小文字に統一すればよろしいかと。

ABCDではなくACGTとしました。

Python

1for line in open("ファイル名"): 2 line = line.strip() 3 if line.startswith('>'): 4 header = line[1:] 5 else: 6 line = line.upper() 7 print(header, 'A:{} C:{} G:{} T:{}'.format(line.count('A'), line.count('C'), line.count('G'), line.count('T')))

これでご要望通り下記のような出力となります

#hoge A:2 C:2 G:2 T:2 #hoge2 A:2 C:3 G:6 T:2

また補足ですが、提示されている出力例でA:20 B:31の間だけ空白2文字ですけどこれ意味ないですよね。こういうのも揃えておいた方がよいです。回答側では分からないので。

#1-9876543 A:20 B:31 C:4 D:7
#2-1234567 A:1 B:23 C:45 D:80

投稿2020/07/11 22:02

aokikenichi

総合スコア2218

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

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

0

1、改行なしにする

print('hoge', end = 'fuga')のようにend引数を指定することによって、改行以外の任意の文字列を改行のかわりに出力できます。

投稿2020/07/11 10:59

can110

総合スコア38260

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

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

0

3、大文字と小文字を区別せずまとめ、A,B,C,Dの四つについて数えたい
について回答します。

文字列を大文字か小文字に統一してからカウントすれば良いです。
下記は簡単な例です。

Python

1s = "AcddDCBACDcA" 2s = s.upper() 3print(s) 4'ACDDDCBACDCA'

Pythonで大文字・小文字を操作する文字列メソッド一覧

投稿2020/07/11 10:44

meg_

総合スコア10579

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問