【问题标题】:Renaming files in a folder according to string in another file - with Python根据另一个文件中的字符串重命名文件夹中的文件-使用Python
【发布时间】:2020-02-25 15:52:26
【问题描述】:

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

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

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

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

在另一个名为 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,它将是“Lactobacillus”。

所以最终结果将如下所示(对于第一个文件夹)。

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

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

谢谢!

【问题讨论】:

  • 你能告诉我们你到目前为止所做的尝试吗?
  • 老实说,我不知道如何处理它。但是,我没有提到我更喜欢它在 Python 中。我热衷于听取如何开始的建议。我一直在使用 Python 来处理文本文件的数据。
  • 您可以使用 os.rename() 更改文件夹名称,也可以通过 ''.split('g__') 拆分字符串。 stackoverflow.com/questions/8735312/… tutorialspoint.com/python/string_split.htm 这应该可以帮助您开始;)
  • 另外,这会有所帮助:stackoverflow.com/questions/3207219/… 试一试,如果遇到问题。只需添加评论,我会帮助您;)
  • 谢谢,我去看看,有疑问再回复你!

标签: python


【解决方案1】:

这就是我为你准备的:

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 文件夹,只要它们具有相同的结构:I.E.垃圾箱和质量 -> fasta 文件和分类文件。只需将目录指向相应的 bin。此外,导入依赖于被指定为 .txt 文件的分类文件,因此如果在您的操作系统中不明确,那么您需要重命名它。

这是我得到的结果:

【讨论】:

  • 太棒了!很高兴有帮助。并且不要忘记投票并接受答案;)
猜你喜欢
  • 2011-07-14
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2022-09-25
  • 1970-01-01
  • 2019-02-12
  • 2015-06-21
  • 1970-01-01
相关资源
最近更新 更多