python中fasta转为字典
1.fasta转为字典
# 功能:读取解压后的*.fasta文件,将内容按键值对形式存为字典
# 输入:
## fasta_name:解压后的文件名
# 输出:
## fa_dict:包含描述和序列的字典
def fasta2dict(fasta_name): with open(fasta_name) as fa:fa_dict = {}for line in fa:# 去除末尾换行符line = line.replace('\n','')if line.startswith('>'):# 去除 > 号seq_name = line[1:]fa_dict[seq_name] = ''else:# 去除末尾换行符并连接多行序列fa_dict[seq_name] += line.replace('\n','')return fa_dict#"40.txt"
#>gene1
#ATCGGGGGGAAAAAAAAAAA
#GGGCCCCCCCCCCTAAAAAG
#>gene2
#AGTCAAAAAAAAAAAGGGGG
#TTTTTTTAAAAGCCCCCCCCC
a=fasta2dict("40.txt")
print(a)
#序列条数为 : 2
2.fasta反向互补
# 功能:将给定的碱基序列转化为反向互补序列
def DNA_rever_complement(sequence):trantab = str.maketrans('ACGTacgt', 'TGCAtgca') # trantab = str.maketrans(intab, outtab) # 制作翻译表string = sequence.translate(trantab) # str.translate(trantab) # 转换字符string_tmp = list(string)[::-1]string_fin = ''.join(string_tmp)return string_fin
3.获取多个信息
要点:
获取fasta文件反向互补序列
计算fasta文件总碱基个数
N50/N90、GC含量
返回指定位置指定长度的碱基
将所有碱基以300连续“N”作为间隔得到一整条序列
# 功能: 获取fasta文件反向互补序列、计算fasta文件总碱基个数、N50/N90、GC含量、返回指定位置指定长度的碱基、将所有碱基以300连续“N”作为间隔得到一整条序列
# 输入:
## fasta_dict:值为序列信息的字典
## N_percent: N50时为50, N90时为90, 也可以为0~100内的其他整数
## *cut_local:可变长度参数,指定需要提取的碱基位置信息,数据为偶数且为整数。注:此参数可以缺省,表示不进行”返回指定位置指定长度的碱基“的计算
# 输出:总碱基长度,N50或N90以及任意Nn,GC含量,截取指定长度碱基存入字典,将所有碱基以300连续“N”作为间隔得到一整条序列
## rever_comple_seq:获取fasta文件反向互补序列,输出为字典
## all_dna_len: fasta文件中总碱基数
## N_len:N50或N90长度, 输入参数(即,N_percent)需要对应
## GC_percent:GC含量
## fasta_dict_cut:获得指定位置,指定长度的碱基,输出为字典
## all_dna_fin:将所有碱基以300连续“N”作为间隔得到一整条序列,输出为列表
def return_Nn(fasta_dict, N_percent:int, *cut_local:int):import sysrever_comple_seq = {}fasta_dict_counts = {}fasta_dict_cut = {}all_dna = []all_dna_len = 0len_tmp = 0nGC = 0# 将原来字典中碱基序列换成序列长度## key为序列描述信息,value为碱基信息for key,value in fasta_dict.items():# GC碱基数nGC_tmp = value.count("g") + value.count("G") + value.count("c") + value.count("C")nGC += nGC_tmp # 在每条序列后面接300个连续“N”all_dna_tmp = value + 'N'*300all_dna += all_dna_tmp# 调用上述自定义的“DNA_rever_complement”函数, 获取反向互补序列,并存为字典rever_comple_seq[key] = DNA_rever_complement(value)fasta_dict_counts[key] = len(value)# 获取指定长度,指定位置碱基序列## 从第三个参数开始为指定碱基的位置参数(即,cut_local参数),可选参数## 每两个为一对,该参数个数必须为偶数cut_dna = []# 技巧:以步长为2取cut_local参数信息for i in range(len(cut_local))[::2]:if i + 1 < len(cut_local):cut_dna.append(value[cut_local[i]:cut_local[i + 1]])else:print("Error:the lengths of cut_local parameters must be even!!!") sys.exit()fasta_dict_cut[key] = cut_dna# *.fasta文件总碱基数all_dna_len += len(value)# 所有碱基整合为一条序列all_dna_fin = ''.join(all_dna)# GC含量GC_percent = nGC/all_dna_len#print("GC_percent:%f" %GC_percent)# N50或N90cutoff = int(all_dna_len*(N_percent/100))# 将得到的序列长度字典按序列长度降序排序,用于计算N50,N90fasta_dict_counts_order = dict(sorted(fasta_dict_counts.items(), key=lambda k: k[1], reverse = True)) # 按碱基长度排序得到新字典# 注:lambda为匿名函数for key,value in fasta_dict_counts_order.items():len_tmp += valueif len_tmp >= cutoff:#print("N%d为:%d" %(N_percent, value))N_len = valuebreakreturn rever_comple_seq, all_dna_len, N_len, GC_percent, fasta_dict_cut, all_dna_fin
sum_1 = return_Nn(my_fasta_dict, 90, 0, 30, 10, 40)
将列表内长字符串以指定长度输出至文件
# 功能:将列表内长字符串以指定长度输出至文件
# 参数:
## input_file: 待输入的字符串,可以是列表或'str'
## row_length: 每行指定输出的长度
## output_file: 输出文件名称def outPutStrLength(input_file, row_length, output_file):import mathstartpoint = 0input_file = input_file.replace('\n', '') # 替换掉字符串中换行符seg = math.ceil(len(input_file)/row_length) # 每行输出row_length 个向上取整有seg行,with open(output_file, 'w') as f:for i in range(seg):startpoint = row_length * i #每行的索引点f.write(input_file[startpoint : startpoint + row_length] + "\n") # 索引字符串# print(tempStr[startpoint : startpoint + row_length]) outPutStrLength(sum_1[-1], 60, "fasta_test.fa")
4.统计单碱基重复4 次及以上的序列在每条序列上出现的次数
要点:给每条序列添加一个符号位
如:
AAATCGGGGTCCCC
01200012300123
# 功能:统计单碱基重复 4 次及以上的序列在每条序列上出现的次数,并以“The 4th character A repeat 6 times”形式输出
# 输入:
## fasta_dict:字典,key为序列说明,value为序列信息
## repeat_times_least: 整型,输出的碱基最少重复次数
# 输出:
## 格式化输出def repeat_compute(fasta_dict, repeat_times_least:int):for key,value in fasta_dict.items():print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")print(key)test_str = list(value)flag_list = [0]flag = 0Zero_flag_index = 0Zero_flag_index_list = []for i in range(len(test_str) - 1):Zero_flag_index += 1if test_str[i] == test_str[i + 1]:flag += 1flag_list.append(flag)else:flag = 0flag_list.append(flag)Zero_flag_index_list.append(Zero_flag_index)need_index_tmp = [Zero_flag_index_list[i] for i in range(len(Zero_flag_index_list)) if flag_list[Zero_flag_index_list[i] - 1] >= repeat_times_least -1]if len(flag_list) - Zero_flag_index_list[-1] >= repeat_times_least:need_index = [i-1 for i in need_index_tmp]need_index.append(len(flag_list) - 1)else:need_index = [i-1 for i in need_index_tmp]for i in need_index:print("The %dth character %s repeat %d times" %(i - flag_list[i] + 1, test_str[i], flag_list[i] + 1))repeat_compute(my_fasta_dict, 4)
参考公众号:生信矿工
python中fasta转为字典相关推荐
- Python 将字符串转为字典
引言 在工作中遇到一个小问题,需要将一个 Python 的字符串转为字典,比如字符串: user_info = '{"name" : "john", " ...
- Python将字符串转为字典最佳实践
在工作中我们经常会遇到数据类型之间的互转的问题,而通常我们请求一些API借口返回的结果就是字符串,但是格式是Json的,在Python中转为字典是最易处理的,所以这里记录一下在Python下把字符串转 ...
- python中语法错误-python冒号语法错误python中如何创建字典
python字典定义 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ...
- python中列表 元组 字典 集合的区别
参考文章:python中列表 元组 字典 集合的区别
- python中怎样向字典中添加值_python中向一个字典中加值
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 开发准备cas 的 python sdk 包含了用于访问和操作 cas 的所有 ...
- Python中怎么通过字典的值找到列表中对应的字典,并修改
Python中怎么通过字典的值找到列表中对应的字典,并修改? 接下来就是我的代码 # 定义一个列表,存放字典 card_list = [{"name":"小米" ...
- python 两个dict合并,Python 中两个字典(dict)合并_python dict 合并_python 两个dict合并...
Python 中两个字典(dict)合并_python dict 合并_python 两个dict合并 dict1={1:[1,11,111],2:[2,22,222]} dict2={3:[3,33 ...
- python中元祖 字典 列表的区别_Python中元祖,列表,字典的区别
原博文 2016-08-16 15:25 − Python中有3种內建的数据结构:列表.元祖和字典: 1.列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目. 列表中的 ...
- python如何输入多行数据合并_关于Python中的合并字典,这些问题必须搞清楚!
全文共1474字,预计学习时长6分钟 图源:unsplash Python 3.9现在处于初始开发阶段,但其中让人惊喜的新功能可不少.其中一个是颠覆性的,它能使处理Python字典时编写的代码更具可读 ...
最新文章
- VC++ 获取文件属性创建时间、修改时间和访问时间
- numpy中reshape方法详解
- oracle 提取首字母,oracle 取字段文字拼音首字母
- 杨凌农业自贸区谋定功能-万祥军:对话农民丰收节交易会
- flutter --- 使用dio包
- VC多线程编程之线程创建与示例
- Copy++ 复制 PDF、CAJ 内容时,自动删除空格、空行,以及自动翻译[Win]
- 模糊聚类算法(FCM)和硬聚类算法(HCM)的VB6.0实现及
- 生成树切分matlab_机器学习——手把手教你用Python实现回归树模型
- 19_java之List和Set
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第4节 等待唤醒机制_7_等待唤醒机制需求分析...
- VC++6.0安装番茄助手Visual Assist X和VC6LineNumberAddin的方法
- 神经网络放大图片,神经网络AI滤镜
- 分页中PageSize和absolutepage详解
- 从零开始学习CANoe 系列文章目录汇总
- 《CSAPP》(第3版)答案(第十一章)
- Ardence公司PHAR-LAP ETS 简介
- 写作素材分类整理技巧分享
- 那些常被忽略的 html 标签
- 输入一个四位数将其加密后输出c语言,从键盘输入一个四位数-按如下规则加密后输出...