分享的一些笔记都是我学习
python生物信息学数据管理
这本书后,练习习题后的答案,由于是学习的过程,代码可能写的比较蹩脚,希望得到大家的指正
今天学习的本书的第8章——数据排序
- 自测题8.1:编写一个程序,从文本文件中读取数据表(如下表所示),按第二列排序,将已经排好序的表的前三行写入新的文件
蛋白质 | 消光值 |
---|---|
0.16 | 0.038 |
0.16 | 0.044 |
0.16 | 0.040 |
0.33 | 0.089 |
0.33 | 0.056 |
... | ... |
- 首先将该表命名为'protein_concertration.csv'
- 排序需要用到python的内置函数
sorted
和operator
模块 - 贴出代码如下
#!/usr/bin/python
#coding:utf-8
##导入正则表达式模块
import re
import os
from operator import itemgetter
os.chdir("E:\\生信工具\\python\\python") ## set the working diectory
#from operator import itemgetter
input_file = open('protein_concertration.csv','r')
output_file = open('protein_concertration_sorted.csv','w')
table = [] ## create a empty matrix
header = input_file.readline() ## .readline()一次只读一列,这里是把表达先存储起来
for line in input_file:
col = line.strip().split(',')
col[1] = float(col[1]) ## 先将要排序的这一列的数字转换为浮点型
table.append(col)
table_sorted = sorted(table, key = itemgetter(1)) ## itemgetter指定要排序的那一列
output_file.write(header + '\n')
n = 0
for row in table_sorted:
if n < 3: ## 输出前三列,由于python索引从0开始,所以这里设置小于3,即索引0,1,2代表前三行
row = [str(x) for x in row] ## 重新转为字符型
output_file.write(','.join(row) + '\n')
n = n + 1
else:
break
output_file.close()
- 8.2 按序列长度(由长至短)对多序列fasta文件排序。提示:首先要解析在第4章中学到的文件并创建列表的列表,每行包含三个要素(标题、序列、序列长度)。然后根据子列表的第3个元素对列表排序,最后将已经排序列表写入文件
- 原文件如下,fasta序列
>FG4821B_Tag23502;barcodelabel=FG4821B;size=3260
CACGTAAGTTGCGAGCGTTGTTCGGAATTATTGGGCGTAAAGGGTATGTAGGCGGTTCTGCAAGTCTGGTGTGAAATGCCGGGGCTCAACCCCGGAACTGCGTTGGAAACTGCAGGACTTGAATCGCTGAGGGGCAGCCAGAATTCCAGGTGTAGGGGTGAAATCTGTAGATATCTGGAAGAATA
>M4734B_Tag23146;barcodelabel=M4734B;size=2827
CACGTAAGTTGCGAGCGTTGTTCGGAATTATTGGGCGTAAAGGGTATGTAGGCGGTTCTGCAAGTCTGGTGTGAAATGCCGGGGCTCAACCCCGGA
>M4246B_Tag21426;barcodelabel=M4246B;size=1661
CACGTAAGTTGCGAGCGTTGTTCGGAATTATTGGGCGTAAAGGGTATGTAGGCGGTTCTGCAAGTCTGGTGTGAAATGCCGGGGCTCAACCCCGGAACTGCGTTGGAAACTGCAGGACTTGAATCGCTGAGGGGCAGCCAGAATTCCAGGTGTAGGG
>G4987A_Tag22462;barcodelabel=G4987A;size=1649
TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGTCGTTTAAGCGTGTTGTGAAATGCCGCGGCTCAACCGTGGCACTGCAGC
- 先将fasta文件的header和对应的seq合并成一个列表,以','分隔
- 接着计算seq碱基的长度,用到len()函数
- 将seq长度变量添加到之前列表的后面,构成三个元素的列表,<font color=red size=2 >贴出代码如下</font>
#!/usr/bin/python
#coding:utf-8
###从GSE30169_series_matrix.txt文件中制作单纯matrix文件
##导入正则表达式模块
import re
import os
from operator import itemgetter
os.chdir("E:\\生信工具\\python\\python")##set the working directory
#from operator import itemgetter
input_file = open('test20171228.fa','r')
output_file = open('fasta_length_matrix.txt','w')
seq = ''
#header = input_file.readline()
for line in input_file:
line = line.strip()
if line[0:1] == '>':
header = line[1:]
#table.append(str(header))
else:
seq = seq + line
length = len(seq) ## 计算序列长度
output_file.write(str(header) + ',' + str(seq) + ',' + str(length) + '\n')
#table.append( str(seq) + ',' + str(length) + '\n')
input_file.close()
output_file.close()
f2 = open('fasta_length_matrix.txt','r')
f3 = open('fasta_length_sort.txt','w')
table = []
for line in f2:
col = line.split(',')
col[2] = float(col[2])
table.append(col)
table_sorted = sorted(table, key = itemgetter(2),reverse=True) ## 根据序列长度排序,反向排序
for row in table_sorted:
row = [str(x) for x in row]
f3.write(','.join(row) + '\n')
f2.close()
f3.close()
python八卦图
网友评论