首页 > 解决方案 > 根据另一个文件中的字符串重命名文件夹中的文件-使用Python

问题描述

我正在做一项生物信息学研究,我在其中处理一些数据并将一些输出放入一些所需的文件夹中。文件夹/文件结构如下所示,其中两个文件夹:

binned/90-20-09-2018/bins/90-20-09-2018.001、90-20-09-2018.002、90-20-09-2018.003等等

binned/90-25-04-2018/bins/90-25-04-2018.001、90-25-04-2018.002、90-25-04-2018.003等等

我知道文件夹的数量,但文件夹中的文件数量是未知的,并且会有所不同。

在另一个名为 taxonomy 的文件中(例如 binned/90-20-09-2018/bins/quality/taxonomy.txt)是每个 bin 的细菌名称表(文件名为 90-20-09-2018.001、90 -20-09-2018.002 等)。如您所见,每个 bin ID 是一个对应的分类。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------
  Bin Id              # unique markers (of 43)   # multi-copy   Taxonomy                                                                                              
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
  90-20-09-2018.001              25                   15        k__Bacteria;p__Firmicutes;c__Bacilli;o__Lactobacillales;f__Lactobacillaceae;g__Lactobacillus          
  90-20-09-2018.003              24                   0         k__Bacteria;p__Firmicutes;c__Bacilli;o__Lactobacillales;f__Streptococcaceae;g__Streptococcus          
  90-20-09-2018.002              15                   0         k__Bacteria;p__Firmicutes;c__Bacilli;o__Lactobacillales;f__Lactobacillaceae_2;g__Lactobacillus_2      
  90-20-09-2018.005              14                   11        k__Bacteria;p__Firmicutes;c__Clostridia;o__Clostridiales;f__Lachnospiraceae                           
  90-20-09-2018.004              12                   0         k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__Actinomycetaceae;g__Mobiluncus  
----------------------------------------------------------------------------------------------------------------------------------------------------------------------

我需要的是将每个 bin 文件(90-20-09-2018.001、90-20-09-2018.002 等)重命名为相应的分类(属)名称。属名是“g”之后的名称。所以对于 bin 001,它将是“乳酸杆菌”。

所以最终结果看起来像这样(对于第一个文件夹)。

binned/90-20-09-2018/bins/Lactobacillus, Lactobacillus_2, Streptococcus

我想这是用 Python(我熟悉的唯一编程语言)完成的,如果我太不清楚,请随时提出问题。

谢谢!

标签: python

解决方案


所以这就是我为你准备的:

import pandas as pd
import glob
from os.path import split, splitext
from os import rename

directory = r'D:\Research and Teaching\ZZ General\Python\binned\90-20-09-2018'

fastas = r'\bins\*.fasta'

taxonomy = r'\quality\*.txt'

fasta_dir = {splitext(split(fasta_file)[1])[0]: fasta_file 
             for fasta_file in glob.glob(directory+fastas)}

tax = pd.read_table(glob.glob(directory+taxonomy)[0]).to_numpy()

data = {count: [item for item in tax[count][0].split(' ') if item != '']
        for count, line in enumerate(tax)}

files = {data[item][0]: data[item][-1].split(';')[-1] 
        for item in data if data[item][0] != data[item][-1]}

for key in fasta_dir:
    rename(fasta_dir[key], split(fasta_dir[key])[0]+'\\'+files[key]+r'.fasta')

基本上我们正在做的是我们正在创建输入文件字符串的字典和分类文件中的属(实际上,最精确的分类,因为可以看出,有时你的解决方案只适用于家庭),并捆绑'os.rename' 命令的那些字典,它正在为我们进行名称交换。

这应该适用于任何 bin 文件夹,只要它们具有相同的结构:IE bins and quality -> fasta files and taxonomy file。只需将目录指向相应的 bin。此外,导入取决于被指定为 .txt 文件的分类文件,因此如果在您的操作系统中不明确,则需要重命名它。

这是我得到的结果:

在此处输入图像描述


推荐阅读