我试图从一个文件中提取出所有的蛋白质名称,并将其保存为一个列表,但是我继续获得一个空列表作为我的输出。下面是文件中几行代码的示例。请注意,这个文件基本上是不同物种的蛋白质,我需要提取由物种的OS=名称表示的名称。
sp|Q8C025|CHPT1_MOUSE Cholinephosphotransferase 1 OS=Mus musculus GN=Chpt1 PE=1 SV=1
sp|Q9Y6K0|CEPT1_HUMAN Choline/ethanolaminephosphotransferase 1 OS=Homo sapiens GN=CEPT1 PE=1 SV=1
sp|O14735|CDIPT_HUMAN CDP-diacylglycerol--inositol 3-phosphatidyltransferase OS=Homo sapiens GN=CDIPT PE=1 SV=1
sp|Q8WUD6|CHPT1_HUMAN Cholinephosphotransferase 1 OS=Homo sapiens GN=CHPT1 PE=1 SV=1
sp|P17898|CPT1_YEAST Cholinephosphotransferase 1 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=CPT1 PE=1 SV=3
sp|O80952|PGPS1_ARATH CDP-diacylglycerol--glycerol-3-phosphate 3-phosphatidyltransferase 1, chloroplastic OS=Arabidopsis thaliana GN=PGPS1 PE=1 SV=1
sp|P22140|EPT1_YEAST Choline/ethanolaminephosphotransferase 1 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=EPT1 PE=1 SV=2,在上面的例子中的物种名称,musculus,家鼠。所有的序列名称都与“OS=”相似,表示物种名称的开头,其次是属和用空格分隔的物种。
贝娄是这个问题的说明:
到目前为止,这就是我所编码的:
name_file= open("protein_names.txt")
name_file_contents = name_file.readlines()
name_file_2=str(name_file_contents)
protein = r"^OS=(.\n.)$"
search= re.search(protein,name_file_2)
species_names= []
for protein_names in name_file:
if search:
search.group()
species_names.append(search.group())
print(species_names)收到一份空的名单,不知道我哪里出了问题。
发布于 2019-11-02 01:40:17
有很多不同的方法来实现这一点,我将继续努力寻找一个更好的方法。其他用户已经就您的代码给出了建议,所以我现在没有任何要添加的内容。
现在,这里有一个简单的解决方案。它懒洋洋地读取文件,所以内存的使用不应该是一个问题。
import re
org_name_regex = re.compile(r'(?<=OS=)[a-zA-Z0-9 ()/]+(?= )')
def get_file_org_names(file_path, unique=True):
with open(file_path, 'r') as in_file:
match_objs = (org_name_regex.search(curr_line) for curr_line in in_file)
names_lst = (item.group() for item in match_objs if item is not None)
if unique:
return set(names_lst)
else:
return list(names_lst)
org_names_unq = set(get_file_org_names(protein_file_path, True))发布于 2019-11-01 21:39:12
迭代每一行并在re.search中使用正则表达式re.search。检查是否匹配,如果匹配,则使用group(1)将组括号中的组添加到物种集合中:
import re
species = set()
with open("protein_names.txt") as protein_file:
for line in protein_file:
result = re.search("OS=\\s*(\\S+ \\S+)", line)
if result is not None:
species.add(result.group(1))
print(species)为了好玩,这里有一个在一行中完成大部分工作的版本:
import re
species = None
with open("protein_names.txt") as protein_file:
species = set(result.group(1) for result in re.finditer("OS=\\s*(\\S+ \\S+)", protein_file.read()))
print(species)而且为了更多的乐趣,另一条~-一行程序迭代文件,而不是一次全部加载它:
import re, itertools
species = None
with open("protein_names.txt") as protein_file:
species = set(result.group(1) for result in itertools.chain(
*(re.finditer("OS=\\s*(\\S+ \\S+)", line) for line in protein_file)
))
print(species)https://stackoverflow.com/questions/58665022
复制相似问题