3 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
使用生成器,您可以定義一個(gè)惰性讀取器,該讀取器每次都會(huì)生成4個(gè)值的列表。
您可以如下所述耗盡或延遲迭代生成器。
import csv
from io import StringIO
mystr = StringIO("""1 @M9890393393
2 ATCTGTAAAA
3 +
4 FG%@ATAAAA
5 @M9890393394
6 ATGTCTATCC
7 +
8 AA%$$983089
""")
def gen():
# replace mystr with open('file.csv', 'r')
with mystr as fin:
reader = csv.reader(fin, delimiter=' ', skipinitialspace=True)
res = []
for line in reader:
res.append(line[1])
if len(res) == 4:
yield res
res = []
用盡發(fā)電機(jī):
lines = list(gen())
print(lines)
[['@M9890393393', 'ATCTGTAAAA', '+', 'FG%@ATAAAA'],
['@M9890393394', 'ATGTCTATCC', '+', 'AA%$$983089']]
迭代生成器:
for line in gen():
print(line)
['@M9890393393', 'ATCTGTAAAA', '+', 'FG%@ATAAAA']
['@M9890393394', 'ATGTCTATCC', '+', 'AA%$$983089']

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
fastq格式易于解析,您可以在行的開頭開始檢查“ @”。那就是你的序列號(hào)。然后,您可以簡單地追加接下來的3行,然后重新開始。如果質(zhì)量得分行也以“ @”開頭,則可能會(huì)出現(xiàn)一種“罕見”的問題情況。但是,即使這種情況也很容易發(fā)現(xiàn),因?yàn)橘|(zhì)量得分行始終位于“ +”行之后。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
如果您只想將其分成4個(gè),則可以使用:
In []:
with open('your_file') as f:
result = list(zip(*[map(str.strip, f)]*4)) # Assumes Py3+ use iter(map(...)) in Py2
result
Out[]:
[('@M9890393393', 'ATCTGTAAAA', '+', 'FG%@ATAAAA'),
('@M9890393394', 'ATGTCTATCC', '+', 'AA%$$983089')]
為每個(gè)變量創(chuàng)建變量的想法通常沒有多大意義,但dict如果第一行包含您要使用的ID,則可能有用:
In []:
with open('your_file') as f:
result = {head: tail for head, *tail in zip(*[map(str.strip, f)]*4)}
result
Out[]:
{'@M9890393393': ['ATCTGTAAAA', '+', 'FG%@ATAAAA'],
'@M9890393394': ['ATGTCTATCC', '+', 'AA%$$983089']}
抱歉,假設(shè)為示例添加了行號(hào),而不是數(shù)據(jù)集的一部分。您可以將替換為zip()以下以刪除數(shù)字(從@jpp的答案中借用):
from operator import itemgetter
zip(*[map(itemgetter(1), csv.reader(f, delimiter=' ', skipinitialspace=True))]*4)
添加回答
舉報(bào)