0

Python3を使用して「fastq」ファイルをタブ区切りファイルに変換しようとしています。入力は次のとおりです(1〜4行目は、タブ区切り形式で印刷する必要がある1つのレコードです)。ここでは、各レコードをリスト オブジェクトに読み込もうとしています。

@SEQ_ID
GATTTGGGGTT
+
!''*((((***
@SEQ_ID
GATTTGGGGTT
+
!''*((((***

これを使用して:

data = open('sample3.fq')
fq_record = data.read().replace('@', ',@').split(',')
for item in fq_record:
        print(item.replace('\n', '\t').split('\t'))

出力は次のとおりです。

['']
['@SEQ_ID', 'GATTTGGGGTT', '+', "!''*((((***", '']
['@SEQ_ID', 'GATTTGGGGTT', '+', "!''*((((***", '', '']

出力の先頭に空白行が表示されますが、その理由がわかりません?? これは他の多くの方法で実行できることを認識していますが、Python を学習しているため、その理由を理解する必要があります。ありがとう

4

3 に答える 3

1

で置き換える場合@,@、文字列の先頭にカンマを置きます (で始まるため@)。次に、コンマで分割すると、最初のコンマの前に何もないため、分割で空の文字列が得られます。何が起こるかは、基本的に次のようになります。

>>> print ',x'.split(',')
['', 'x']

データが常に で始まることがわかっている場合@は、ループ内の空のレコードをスキップできます。するだけですfor item in fq_record[1:]

于 2013-06-08T19:20:49.197 に答える
0

すべての置換なしで行ごとに移動することもできます。

fobj = io.StringIO("""@SEQ_ID
GATTTGGGGTT
+
!''*((((***
@SEQ_ID
GATTTGGGGTT
+
!''*((((***""")

data = []
entry = []
for raw_line in fobj:
    line = raw_line.strip()
    if line.startswith('@'):
        if entry:
            data.append(entry)
        entry = []
    entry.append(line)
data.append(entry)

data次のようになります。

[['@SEQ_ID', 'GATTTGGGGTTy', '+', "!''*((((***"],
 ['@SEQ_ID', 'GATTTGGGGTTx', '+', "!''*((((***"]]
于 2013-06-09T02:20:24.523 に答える
0

回答ありがとうございます。初心者としての私の主な問題は、概念的に理解した .split(',') での空白行の発生でした。したがって、Python での私の最初の便利なプログラムは次のとおりです。

# this script converts a .fastq file in to .fasta format

import sys 
# Usage statement:
print('\nUsage: fq2fasta.py input-file output-file\n=========================================\n\n')

# define a function for fasta formating
def format_fasta(name, sequence):
fasta_string = '>' + name + "\n" + sequence + '\n'
return fasta_string

# open the file for reading
data = open(sys.argv[1])
# open the file for writing
fasta = open(sys.argv[2], 'wt')
# feed all fastq records in to a list 
fq_records = data.read().replace('@', ',@').split(',')

# iterate through list objects
for item in fq_records[1:]: # this is to avoid the first line which is created as blank by .split() function
    line = item.replace('\n', '\t').split('\t')
    name = line[0]
    sequence = line[1]      
    fasta.write(format_fasta(name, sequence))
fasta.close()

回答で提案されている他のことは、私がもっと学ぶにつれて、より明確になるでしょう。再度、感謝します。

于 2013-06-09T19:20:38.933 に答える