【问题标题】:Compiling lines from file that are separated by a certain element . Python从文件中编译由某个元素分隔的行。 Python
【发布时间】:2013-01-28 06:48:11
【问题描述】:

文件:

>1
ATTTTttttGGGG
ccCgCgGAgggGGT
gggggttttTTTTTTTTT
>2
ATcggGGGGGGA
>3
ATCGGGGGGATTT
gggggttAGTAttt

我正在构建一个读取具有这种格式的文件的函数。 该格式中嵌入了多个文件,这些文件由'>'+名称分隔(例如'>1','>2')

我正在尝试获取“>”行两侧的文本行并将它们编译为每个部分的一个字符串

所以这看起来像

name_list = ['>1','>2','>3']
sequence_list = ['ATTTTttttGGGGccCgCgGAgggGGTgggggttttTTTTTTTTT','ATcggGGGGGGA','ATCGGGGGGATTTgggggttAGTAttt']

import os
import re

# Open File

in_file=open(FASTA,'r')
dir,file=os.path.split(FASTA)
temp = os.path.join(dir,output)
out_file=open(temp,'w')

# Generating lines

lines = []
name_list = []
seq_list = []

for line in in_file:
    line = line.strip()
    lines.append(line)

in_file.close()

indx = range(0,len(lines))

# Organizing the elements
for line in lines:
    for i in line:
        if i == '>':
            name_list.append(line)
        else:
            break

我不知道如何处理 else: 语句 我尝试使用 range(0,len(lines)) 创建索引 所以也许我可以在它找到'>'的地方做一些事情并为以下索引编译所有行,直到它找到下一个'>'并将它们添加到名为 seq_list 的列表中

任何帮助将不胜感激

【问题讨论】:

  • 也许我没有满足这里的所有要求,但是你能不能只拆分以> 开头的行?
  • 请看我的评论here。简而言之:FASTA 解析器是已经发明出来的轮子,您无需为此浪费时间。

标签: python function indexing line fasta


【解决方案1】:

您应该查看具有 FASTA 解析器的 Biopython,但这里有一个使用标准库的示例:

import re
with open('filename') as f:
    print [i.replace('\n','') for i in re.split(r'\>\d+',f.read()) if i]

出来:

['ATTTTttttGGGGccCgCgGAgggGGTgggggttttTTTTTTTTT',
 'ATcggGGGGGGA',
 'ATCGGGGGGATTTgggggttAGTAttt']

使用Biopython [sudo pip install biopython]:

from Bio import SeqIO
with open("example.fasta", "rU") as handle:
    print list(SeqIO.parse(handle, "fasta"))

出来:

[SeqRecord(seq=Seq('ATTTTttttGGGGccCgCgGAgggGGTgggggttttTTTTTTTTT', SingleLetterAlphabet()), id='1', name='1', description='1', dbxrefs=[]), 
 SeqRecord(seq=Seq('ATcggGGGGGGA', SingleLetterAlphabet()), id='2', name='2', description='2', dbxrefs=[]),
 SeqRecord(seq=Seq('ATCGGGGGGATTTgggggttAGTAttt', SingleLetterAlphabet()), id='3', name='3', description='3', dbxrefs=[])]

【讨论】:

  • 我尝试安装 BioPython,但无法让它在我的机器上运行
  • @draconisthe0ry -- 你用过pip吗?
【解决方案2】:

字典会让生活更轻松:

>>> d = {}
>>> with open('t.txt') as f:
...   for line in f:
...      if line.startswith('>'):
...         key = line.strip()
...         if key not in d:
...             d[key] = []
...      else:
...         d[key].append(line.strip())
... 
>>> d
{'>1': ['ATTTTttttGGGG', 'ccCgCgGAgggGGT', 'gggggttttTTTTTTTTT'],
 '>2': ['ATcggGGGGGGA'], '>3': ['ATCGGGGGGATTT', 'gggggttAGTAttt']}
>>> sequence_list = [''.join(k) for k in d.values()]
>>> sequence_list
['ATTTTttttGGGGccCgCgGAgggGGTgggggttttTTTTTTTTT',
 'ATcggGGGGGGA', 'ATCGGGGGGATTTgggggttAGTAttt']

【讨论】:

  • 然后你可以通过 d.keys() 和 d.values() 得到两个列表(如果需要的话)
  • 合并d.values中的元素怎么样?
  • 我正在努力让它尽可能快,有没有办法连接 else: 行中的字符串?
  • d[key] = ""代替d[key] = [],用d[key] = d[key] + line.strip()代替d[key].append(line.strip())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2023-03-25
  • 1970-01-01
  • 2015-05-21
  • 2010-11-18
  • 1970-01-01
相关资源
最近更新 更多