GTF文件行处理需求:按 拆分后仅拆分最后元素为;分隔项
处理GTF文件的字段拆分需求
首先,先把你提供的GTF文件摘录放出来,方便对照:
X Ensembl Repeat 2419108 2419128 42 . . hid=trf; hstart=1; hend=21 X Ensembl Repeat 2419108 2419410 2502 - . hid=AluSx; hstart=1; hend=303 X Ensembl Repeat 2419108 2419128 0 . . hid=dust; hstart=2419108; hend=2419128 X Ensembl Pred.trans. 2416676 2418760 450.19 - 2 genscan=GENSCAN00000019335 X Ensembl Variation 2413425 2413425 . + .
按照你的要求,我们需要先按制表符拆分每一行,然后只对拆分后的最后一个元素按分号拆分。下面用Python来实现这个逻辑,代码简单易懂,适合生物信息学日常处理:
# 示例GTF行列表 gtf_lines = [ "X Ensembl Repeat 2419108 2419128 42 . . hid=trf; hstart=1; hend=21", "X Ensembl Repeat 2419108 2419410 2502 - . hid=AluSx; hstart=1; hend=303", "X Ensembl Repeat 2419108 2419128 0 . . hid=dust; hstart=2419108; hend=2419128", "X Ensembl Pred.trans. 2416676 2418760 450.19 - 2 genscan=GENSCAN00000019335", "X Ensembl Variation 2413425 2413425 . + ." ] for line in gtf_lines: # 第一步:按制表符拆分整行 split_parts = line.split('\t') # 第二步:只处理最后一个元素,按分号拆分 if split_parts[-1].strip(): # 检查最后一个字段是否非空 last_part_split = split_parts[-1].split(';') # 把拆分后的最后字段替换回去 split_parts[-1] = last_part_split # 打印处理后的结果 print(f"处理后的行:{split_parts}")
运行这段代码后,你会得到这样的输出(以第一行为例):
处理后的行:['X', 'Ensembl', 'Repeat', '2419108', '2419128', '42', '.', '.', ['hid=trf', ' hstart=1', ' hend=21']]
如果需要更易读的结构化输出,还可以把拆分后的键值对转换成字典:
for line in gtf_lines: split_parts = line.split('\t') last_part = split_parts[-1].strip() attr_dict = {} if last_part: for attr in last_part.split(';'): attr = attr.strip() if attr: key, value = attr.split('=', 1) attr_dict[key] = value split_parts[-1] = attr_dict print(f"结构化后的行:{split_parts}")
对应的输出会变成:
结构化后的行:['X', 'Ensembl', 'Repeat', '2419108', '2419128', '42', '.', '.', {'hid': 'trf', 'hstart': '1', 'hend': '21'}]
这个逻辑完全符合你的需求:先拆分整行,仅处理最后一个字段的分号拆分,同时兼容最后一个字段为空的情况(比如第五行)。
内容的提问来源于stack exchange,提问作者Nisba
相关产品推荐
相关产品推荐

