0

我正在尝试使用 python3 将“fastq”文件转换为制表符分隔的文件。这是输入:(第 1-4 行是我需要以制表符分隔格式打印的一条记录)。在这里,我试图将每条记录读入列表对象:

@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 回答