感谢CSDN博主JamH的文章动物miRNA靶基因本地预测(二)——数据准备,提供了非常详实的操作代码。我本人对python了解的并不多,仅能读懂代码,所以对作者给出的代码进行分析并作笔记整理。
文中用到的Python代码解读
str.strip([chars]);
该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
os.listdir()
返回指定目录下的所有文件和目录名。
import osname = os.listdir(os.getcwd())
print(name)
1. miRNA序列整合代码:
原始文件.png# 导入csv模块,没安装的需要先安装
import csv
with open('D:\\用户\\桌面\\test.csv') as f:
r = csv.reader(f)
for row in r:
print(row)
# row是一个列表,将每一个列表都拼接成一行,即为一个miRNA的fasta格式
line = '>' + row[0] + '\n' + row[1] + '\n'
# 逐行保存
with open('D:\\用户\\桌面\\test.txt', 'a') as r:
r.writelines(line)
对代码的解析:
1)导入csv模块;
2)使用open()方法打开这个csv文件,并将其存入变量f中;
3)csv.reader()方法需要传递一个文件对象参数,从而创建一个与该文件相关联的阅读器(reader)对象,这里读取的结果就是列表(与后面的fasta文件有所区别);
4)print(row)打印读取的文件对象内容;
5)然后读取列表的行,添加上">"符号,加上每行列表的第一个元素row[0],并加上换行符"\n",再读取第二个元素加上换行符"\n";
6)打开文件(可追加模式),存储为test.txt,然后将line写进去。
最后呈现的效果就是,
因为也读取了行头,所有需要删除前面两行
sed -i '1,2d' test.txt
2. 转换为targetscan要求的miRNA数据格式
图片.pngwith open(r'D:\用户\桌面\test.txt') as f:
for line in f:
line = line.strip()
if len(line) == 0:
continue
line = line.replace('\n', '').replace('>', '\n>')
if line.startswith('\n>'):
line = line.replace('>','') + '\t'
else:
line = line[1:8] + '\t' + '10010'
with open(r'D:\用户\桌面\test_targetscan.txt','a') as r:
r.writelines(line)
对代码的解析:
1)打开test.txt文件并存储为变量f;
2)去除每行左右空白,然后去除空行并继续;
[line.strip()用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列;]
3)line.replace('\n', '').replace('>', '\n>'),去除每行中的换行符号"\n",同时将">"更换为"\n>"(所以第一个序列前会出现多余的一个空行;此时,名字和序列仍然分别存在两行内);#这里去除了每行的换行符,所以是在一列内。
4)在查看的一列中,如果是以换行符加上">",去掉">",并在后面添加一个分隔符"\t";
5)在本列中出去上面的之外,如果不是以换行符加上">"(也就是纯粹的碱基序列行),取行的第2至8个元素(种子序列),加上分隔符,再加上物种ID,即10010;并且,两次去读的结果都放在了一个line里面。就是:
miR-1-3p GGAATGT 10010
6)打开文件(可追加模式),存储为test_targetscan.txt,然后将line写进去。
记得最后手动删除一下空余的行
grep . data.txt
grep -v '^$' data.txt
grep'[^$]’data.txt
合并多个mRNA序列文件(分散的fasta文件)
图片.png# 导入os模块
import os
# 获取目标文件夹的路径
path = 'D:\\用户\\桌面\\test'
# 获取当前文件夹中的文件名称列表
filenames = os.listdir(path)
# 逐个获取文件路径,并处理
for filename in filenames:
filepath = path + '\\' + filename
# 读取单个文件,并逐行处理
with open(filepath) as f:
for line in f:
# 去除每行左右空白
line = line.strip()
# 去除空白行
if len(line) == 0:
continue
# 合并序列为一行
line = line.replace('\n', '').replace('>', '\n>')
if line.startswith('\n>'):
# 去除多余信息,仅保留gene_id
line = line.split(' ')[0] + '\n'
# 保存
with open('D:\\用户\\桌面\\mRNA_16.txt', 'a') as r:
r.writelines(line)
对代码的解析:
1)导入os模块[1];
2)获取目标文件夹的路径;
3)os.listdir(path)获取当前文件夹中的文件名称列表;
4)给每个文件单独分配路径,filepath = path + '\' + filename;文件路径就成了单独的路径地址,是批量操作单个路径的方法。结果应该为(示例):
/home/usr/input/3UTR/ACE.fasta
/home/usr/input/3UTR/Akt.fasta
……
5)读取单个文件并存储为变量f,并逐行处理(此时就是打开路径中的文件内容)
6)去除每行左右空白,去除空行并继续;
7)line.replace('\n', '').replace('>', '\n>'),去除每行中的换行符号"\n",同时将">"更换为"\n>"(所以第一个序列前会出现多余的一个空行;
此时,#错误,名字和序列仍然分别存在两行内--);
8)如果是以换行符加上">",先split这个行并提取分裂后的第一个元素,然后在加上换行符号;
9)打开文件(可追加模式),存储为test_targetscan.txt,然后将line写进去。
记得最后手动删除一下空余的行
另类文件转换
如果给出的文件格式是如下的格式,就需要再转换为标准格式:
图片.png
with open(r'D:\用户\桌面\total_reverse_CDS201703.fa', encoding='gbk') as fastas:
for line in fastas:
line = line.strip()
if len(line) == 0:
continue
line = line.replace('\n', '').replace('>', '\n>')
if line.startswith('\n>'):
line = line.replace('gene=','') + '\n'
with open(r"D:\用户\桌面\total_reverse_CDS201703.txt", 'a') as f:
f.writelines(line)
对代码的解析:
1)读取保存好的文件total_reverse_CDS201703.txt;
2)去除每行左右空白,去除空行并继续;
3)line.replace('\n', '').replace('>', '\n>'),去除每行中的换行符号"\n",同时将">"更换为"\n>"(所以第一个序列前会出现多余的一个空行);
4)line.replace('gene=','') + '\n',去除每行中的"gene=",同时添加换行符号(所以第一个序列前会出现多余的一个空行;
错误,此时,名字和序列仍然分别存在两行内);
5)打开文件(可追加模式),存储为test_targetscan.txt,然后将line写进去。
记得最后手动删除一下空余的行
mRNA输入格式(Targetscan要求格式)
with open(r'D:\用户\桌面\total_reverse_CDS201703.txt') as f:
for line in f:
line = line.strip()
if len(line) == 0:
continue
line = line.replace('\n', '').replace('>', '\n>')
if line.startswith('\n>'):
line = line.replace('>','') + '\t' + '10010' + '\t'
with open(r'D:\用户\桌面\total_reverse_CDS201703_targetscan.txt','a') as r:
r.writelines(line)
对代码的解析:
1)读取保存好的文件total_reverse_CDS201703.txt;
2)去除每行左右空白,去除空行并继续;
3)line.replace('\n', '').replace('>', '\n>'),去除每行中的换行符号"\n",同时将">"更换为"\n>"(所以第一个序列前会出现多余的一个空行;
此时,名字和序列仍然分别存在两行内);
4)打开文件(可追加模式),存储为total_reverse_CDS201703_targetscan.txt,然后将line写进去。
记得最后手动删除一下空余的行
#else:#个人理解的,这里应该也有一个合并的流程。但是上一步已经将碱基序列的行的换行符合去掉了。
# line = line[]
4)下面的操作就是追加,将名字和序列在一行内);
else:
line = line[1:8] + '\t' + '10010'
网友评论