使用正则表达式将数据转换为Python中的字典
我有一个采用FASTA格式排序的数据集,基本上是这样的:
>pc284
ATCGCGACTCGAC
>pc293
ACCCGACCTCAGC
我想将每个标签用作字典中的键,并将基因存储为值。
这是我的代码,但实际上没有做任何事情:
import re
fileData = open('d.fasta', 'r')
myDict = dict()
for line in fileData:
match = re.search('(\>)(\w+)(\r)(\w+)', line)
if match:
gene = match.group(3)
myDict[gene[0]] = gene[1]
print myDict
-
\r
不是有效的字符类,我想您打算使用它\s
。如果您也不使用它们,则可以减少它们的数量。但最重要的是,您需要正确提取组:
match = re.search(r'>(\w+)\s+(\w+)', line) if match: tag, gene = match.groups() myDict[tag] = gene
通过仅创建 两个 捕获组,我们可以更简单地使用提取这 两个 捕获组
.groups()
并将它们直接分配给两个变量tag
和gene
。但是,读取FASTA格式似乎表明这是一种多行格式,标签位于一行,其后的基因数据位于
多 行。在这种情况下,您本\r
应匹配换行符。当您一次读取一行文件时,此功能将无效。如果没有这样的正则表达式,则读取该格式会简单得多:
myDict = {} with open('d.fasta', 'rU') as fileData: tag = None for line in fileData: line = line.strip() if not line: continue if line[0] == '>': tag = line[1:] myDict[tag] = '' else: assert tag is not None, 'Invalid format, found gene without tag' myDict[tag] += line print myDict
这将逐行读取文件,根据起始
>
字符检测标签,然后读取 多 行基因信息,将其收集到最近读取的标签下的字典中。注意
rU
模式;我们使用python的通用换行模式打开文件,以处理用于创建文件的换行约定。最后但并非最不重要的; 看看BioPy项目;
他们的Bio.SeqIO
模块可以完美处理FASTA以及许多其他格式。