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转为字典相关推荐

  1. Python 将字符串转为字典

    引言 在工作中遇到一个小问题,需要将一个 Python 的字符串转为字典,比如字符串: user_info = '{"name" : "john", " ...

  2. Python将字符串转为字典最佳实践

    在工作中我们经常会遇到数据类型之间的互转的问题,而通常我们请求一些API借口返回的结果就是字符串,但是格式是Json的,在Python中转为字典是最易处理的,所以这里记录一下在Python下把字符串转 ...

  3. python中语法错误-python冒号语法错误python中如何创建字典

    python字典定义 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ...

  4. python中列表 元组 字典 集合的区别

    参考文章:python中列表 元组 字典 集合的区别

  5. python中怎样向字典中添加值_python中向一个字典中加值

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 开发准备cas 的 python sdk 包含了用于访问和操作 cas 的所有 ...

  6. Python中怎么通过字典的值找到列表中对应的字典,并修改

    Python中怎么通过字典的值找到列表中对应的字典,并修改? 接下来就是我的代码 # 定义一个列表,存放字典 card_list = [{"name":"小米" ...

  7. 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 ...

  8. python中元祖 字典 列表的区别_Python中元祖,列表,字典的区别

    原博文 2016-08-16 15:25 − Python中有3种內建的数据结构:列表.元祖和字典: 1.列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目. 列表中的 ...

  9. python如何输入多行数据合并_关于Python中的合并字典,这些问题必须搞清楚!

    全文共1474字,预计学习时长6分钟 图源:unsplash Python 3.9现在处于初始开发阶段,但其中让人惊喜的新功能可不少.其中一个是颠覆性的,它能使处理Python字典时编写的代码更具可读 ...

最新文章

  1. VC++ 获取文件属性创建时间、修改时间和访问时间
  2. numpy中reshape方法详解
  3. oracle 提取首字母,oracle 取字段文字拼音首字母
  4. 杨凌农业自贸区谋定功能-万祥军:对话农民丰收节交易会
  5. flutter --- 使用dio包
  6. VC多线程编程之线程创建与示例
  7. Copy++ 复制 PDF、CAJ 内容时,自动删除空格、空行,以及自动翻译[Win]
  8. 模糊聚类算法(FCM)和硬聚类算法(HCM)的VB6.0实现及
  9. 生成树切分matlab_机器学习——手把手教你用Python实现回归树模型
  10. 19_java之List和Set
  11. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第4节 等待唤醒机制_7_等待唤醒机制需求分析...
  12. VC++6.0安装番茄助手Visual Assist X和VC6LineNumberAddin的方法
  13. 神经网络放大图片,神经网络AI滤镜
  14. 分页中PageSize和absolutepage详解
  15. 从零开始学习CANoe 系列文章目录汇总
  16. 《CSAPP》(第3版)答案(第十一章)
  17. Ardence公司PHAR-LAP ETS 简介
  18. 写作素材分类整理技巧分享
  19. 那些常被忽略的 html 标签
  20. 输入一个四位数将其加密后输出c语言,从键盘输入一个四位数-按如下规则加密后输出...

热门文章

  1. windows terminal agnoster 主题乱码问题
  2. docker mysql初始化数据及数据持久化
  3. 《阿凡达》续集:地球人重返avatar潘多拉星球,成功摘取带回Navi族食物
  4. 我国跨境电商进出口规模5年来增长近10倍
  5. SQL每日一题(20210824)假设计算日期是从2021-7-13开始计算,PENDING_DAYS表示到货还需要的天数
  6. <pre>标签有什么用
  7. ChemDrew如何翻转化学结构
  8. linux系统日志分几个等级,Linux下日志系统详解
  9. 口腔粘膜病学重点总结
  10. android支付宝、微信支付开发流程