Contact me:

序列拆分及批量归类至文件夹(v1)

拿到一堆线粒体rna的coI序列,由于全部序列都放在一个txt文件里面,因为后期需要把每一个序列单独拿出来fas文件,然后根据一个表格分类到种。要手动复制粘贴不知道要花多久,所以就用python自动化一下。

v1
整个过程分三步

1.拆分为以缩写命名的单个文件

#split into single seq
import os
import pandas as pd
from tst import bad_val

file_path=os.path.abspath(r"E:\新建文件夹\新建文件夹")
df_E2a = pd.read_excel("E2a.xlsx")
df_ce2e = pd.read_excel("E:\pythonProject1\CE2E.xlsx")

df_E2a.index = df_E2a['ab.']
a = ">"

f=open(r'E:\新建文件夹\新建文件夹\COI(1).fas')
for line in f:
    if line.startswith(">"):
        new=line.lstrip('>').strip('\n')
        if new in bad_val:
            full = 'Not found!'+ new
        else:
            full = df_E2a.name[df_E2a['ab.'].loc[new]]
        outfile = open("E:\新建文件夹\新建文件夹\db\\"+"%s"%new + '.' + 'fas',"w")
        outfile.write(line+next(f))
        outfile.close()




print("Finished")

2.将同一物种的序列归类,放入以物种命名的文件夹

classify

import os # os是用来切换路径和创建文件夹的。
import pandas as pd
from tst import bad_val
from shutil import copy # shutil 是用来复制黏贴文件的
df_E2a = pd.read_excel("E2a.xlsx")
df_E2a.index = df_E2a['ab.']
file_path = r'E:\新建文件夹\新建文件夹\db' # 想拆分的文件夹所在路径,也就是一大堆文件所在的路径
save_dir = r'E:\新建文件夹\新建文件夹\class' # save_dir 是想把复制出来的文件存放在的路径

获取 file_path 下的文件和文件夹列表

因为 file_path 里面没有文件夹,所以不处理有文件夹的情况

pathDir = os.listdir(file_path) # os.listdir(file_path) 是获取指定路径下包含的文件或文件夹列表
for filename in pathDir: # 遍历pathDir下的所有文件filename
file_name = filename.split('.')[0]

if file_name in bad_val:
    full = '!Not found!'
else:
    full = df_E2a.name[df_E2a['ab.'].loc[file_name]]

dir_name = full.strip()  # 新的文件夹的命名


from_path = os.path.join(file_path, filename)  # 旧文件的绝对路径(包含文件的后缀名)
to_path = save_dir + "\\" + dir_name  # 新文件的绝对路径

if not os.path.isdir(to_path):  # 如果 to_path 目录不存在,则创建
    os.makedirs(to_path)
copy(from_path, to_path)  # 完成复制黏贴

3.发现txt文件中的缩写与物种名表格的缩写部分不相同,暂时处理:找出无法匹配的缩写单独放入一个文件夹,人工处理

#find the unmatched value
import pandas as pd
import difflib

bad_val = []
df_E2a = pd.read_excel("E2a.xlsx")
f=open(r'E:\新建文件夹\新建文件夹\COI(1).fas')
for line in f:
    if line.startswith(">"):
        new=line.lstrip('>').strip('\n')
        a=difflib.get_close_matches(new,df_E2a['ab.'],1, cutoff=1)
        if len(a)==0:
            bad_val.append(new)
posted @ 2021-05-20 21:54  impwa  阅读(248)  评论(0编辑  收藏  举报