python - 根据另一个文件中的字符串重命名文件夹中的文件-使用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(我熟悉的唯一编程语言)完成的,如果我太不清楚,请随时提出问题。
谢谢!
解决方案
所以这就是我为你准备的:
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 文件的分类文件,因此如果在您的操作系统中不明确,则需要重命名它。
这是我得到的结果: