为了账号安全,请及时绑定邮箱和手机立即绑定

Python:读取文本文件并将文件拆分为列表变量,每个变量各有4行

Python:读取文本文件并将文件拆分为列表变量,每个变量各有4行

拉风的咖菲猫 2021-03-31 13:14:58
我有一个文本文件(fastq文件)。该文件的格式1st line - ID2nd Line - Sequence3rd Line - something4th Line - something else.然后再次重复这4行。例如:1  @M98903933932 ATCTGTAAAA3 +4 FG%@ATAAAA5  @M98903933946 ATGTCTATCC7 +8 AA%$$983089我正在尝试做的是,分割此文件,以便可以按4行读取此文件。我可以制作一个列表,每个变量每个包含4行。在上面的示例中,我将列出带有2个变量的列表。
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

使用生成器,您可以定义一个惰性读取器,该读取器每次都会生成4个值的列表。


您可以如下所述耗尽或延迟迭代生成器。


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 = []

用尽发电机:


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']


查看完整回答
反对 回复 2021-04-09
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

fastq格式易于解析,您可以在行的开头开始检查“ @”。那就是你的序列号。然后,您可以简单地追加接下来的3行,然后重新开始。如果质量得分行也以“ @”开头,则可能会出现一种“罕见”的问题情况。但是,即使这种情况也很容易发现,因为质量得分行始终位于“ +”行之后。


查看完整回答
反对 回复 2021-04-09
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

如果您只想将其分成4个,则可以使用:


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')]

为每个变量创建变量的想法通常没有多大意义,但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']}

抱歉,假设为示例添加了行号,而不是数据集的一部分。您可以将替换为zip()以下以删除数字(从@jpp的答案中借用):


from operator import itemgetter


zip(*[map(itemgetter(1), csv.reader(f, delimiter=' ', skipinitialspace=True))]*4)


查看完整回答
反对 回复 2021-04-09
  • 3 回答
  • 0 关注
  • 392 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信