Python 迭代字典中的值以替换目录中的文件名

Python 迭代字典中的值以替换目录中的文件名,python,csv,os.walk,Python,Csv,Os.walk,全部。我有一个csv文件,在那里我安排了DNA样本ID,我将其发送到96孔板中进行测序。这一点很重要,因为当我们从测序设备取回平板时,色谱图文件的标题很简单,例如5-3-13-g-Templates_A01_Primer-g.ab1 csv以制表符分隔,如下所示:(96口井,12列[1-12],8行[A-H]): 每次我用手拿回盘子时,我都会花时间重新命名96个文件,而不是用我事先准备好的文件来引导我装入盘子,这样我就不会把盘子弄坏(错误的井中有错误的DNA),通过前缀来识别位置(例如A06…H

全部。我有一个csv文件,在那里我安排了DNA样本ID,我将其发送到96孔板中进行测序。这一点很重要,因为当我们从测序设备取回平板时,色谱图文件的标题很简单,例如5-3-13-g-Templates_A01_Primer-g.ab1

csv以制表符分隔,如下所示:(96口井,12列[1-12],8行[A-H]):

每次我用手拿回盘子时,我都会花时间重新命名96个文件,而不是用我事先准备好的文件来引导我装入盘子,这样我就不会把盘子弄坏(错误的井中有错误的DNA),通过前缀来识别位置(例如A06…H06),将其与目录中的文件名匹配,因为它们共享相同的单元格位置,因此脚本将迭代整个csv文件并以以下形式重命名所有文件:5-3-13-G-Templates_A06_Primer-G.ab1将变为A06_Eulophia_euglossa_ITS1.ab1

我已经编写了Python脚本的一部分,但是我很难想象下一步:

import csv
data = csv.DictReader(open('Template.csv', 'rU'), delimiter='\t')
for row in data:
    values = row.values()
    values.sort()
    #Provides values by row in order from left to right
这就是我被困的地方。既然我有了这些清单,接下来该怎么办?循环?我只是在设想解决方案时遇到了一些问题

我想解决方案的一部分应该是下面的代码,根据我找到的另一个答案进行修改:

folder = r"/home/ryan/Desktop/MMEE/plateG" #Make sure only the .ab1 files are in this directory
import os
for root, dirs, filenames in os.walk(folder):
    for filename in filenames:
        fullpath = os.path.join(root, filename)
        filename_split = os.path.splitext(fullpath)
        filename_zero, fileext = filename_split
        os.rename(fullpath, SOMEVARIABLE + fileext)
上面的部分,我用os.rename重命名文件,并使用“SOMEVARIABLE”,我认为上面列表中的名称应该输入到文件名中。但如何做到这一点目前超出了我的技能水平。或者我只是累了

任何帮助都将不胜感激。我希望这足够清楚,但如有必要,我可以作出澄清。干杯

编辑以添加: 旧文件名和新文件名仅共享位置ID,例如A01、B06、H12。新的文件名将取自csv文件,因此名为5-3-13-G-Templates_F08_Primer-G.ab1的文件将从第8列中提取名称,但只提取标题中带有“F08”的名称。行是A到H。基本上,我想从位置RowF,Column8(虽然我现在没有行标题)中选择文本,并将该文本应用到包含F08的文件名。我认为可能有一种方法可以匹配生成的值列表中的每个子字符串A01到H12,并将每个子字符串中的文本拉到它们要替换的旧文件名中,因为它们也与相同的子字符串A01到H12匹配

我希望以这种方式重命名文件:(NB-A01到D04是空白井,因此它们除了ID之外没有其他标签)

  • 处理CSV文件,收集所有新文件名,并将样本ID映射到新名称

  • 遍历目录,找到所有文件,从它们的基本名称中提取样本id,并从第一步创建的
    id\u映射中查找新名称。根据新名称重命名

  • 导入csv
    导入操作系统
    进口稀土
    #首先
    data=csv.DictReader(打开('csv.csv','r'),分隔符=“\t”)
    id_map={}
    对于数据中的行:
    对于第行中的名称。值():
    #在单元格中以列表形式查找所有样本ID,应仅获取1个ID
    ids=re.findall(r'[A-H][0-9]{2}',名称)
    如果len(ids)!=1:
    打印“在”+名称处混淆”
    id\u映射[ids[0]]=名称
    #第二
    文件夹='files/'
    对于os.walk(文件夹)中的根目录、目录和文件:
    对于文件中的文件名:
    fullname=os.path.join(根目录,文件名)
    basename,扩展名=os.path.splitext(文件名)
    #在basename中查找所有示例ID,应仅获取1个ID
    ids=re.findall(r'[A-H][0-9]{2}',basename)
    如果len(ids)!=1:
    打印“+os.path.join(根目录,文件名)”处的“混乱”
    如果id_映射中的id[0]:
    新建\u name=id\u映射[ids[0]]+扩展名
    重命名(全名,os.path.join(根,新名称))
    其他:
    打印“未找到“+全名+”的新名称”
    
    我认为您提供了太多的细节,但忽略了重要的部分,即旧文件名和新文件名如何匹配?从CSV表格的第6列或表格的任何列中,从何处获取新文件名?CSV中有96个字段和96个要重命名的文件,字段如何与特定文件匹配?展示更多的例子。感谢你的洞察力;为了清晰起见,我将尝试添加到编辑中。我想我提供了匹配信息:旧文件名和新文件名将只共享单元格ID,例如A01、B06、H12。新文件名将取自CSV文件,因此名为5-3-13-G-Templates_F08_Primer-G.ab1的文件将从第8列中提取名称,是的,但只有标题中带有“F08”的文件。行是A到H。基本上,我想从位置RowF,Column8(虽然我现在没有行标题)中选择文本,并将该文本应用到包含F08的文件名中。太棒了!这很好地发挥了作用;非常感谢你。我一时忘记了
    re.findall
    。当我们得到序列后,这肯定会节省我在实验室的时间。
    folder = r"/home/ryan/Desktop/MMEE/plateG" #Make sure only the .ab1 files are in this directory
    import os
    for root, dirs, filenames in os.walk(folder):
        for filename in filenames:
            fullpath = os.path.join(root, filename)
            filename_split = os.path.splitext(fullpath)
            filename_zero, fileext = filename_split
            os.rename(fullpath, SOMEVARIABLE + fileext)
    
    5-3-13-G-Templates_E04_Primer-G.ab1 > E04_Dipodium_6052_ITS1.ab1
    5-3-13-G-Templates_F04_Primer-G.ab1 > F04_Dipodium_6052_ITS4.ab1
    5-3-13-G-Templates_G04_Primer-G.ab1 > G04_Dipodium_6055_ITS1.ab1
    5-3-13-G-Templates_H04_Primer-G.ab1 > H04_Dipodium_6055_ITS4.ab1
    5-3-13-G-Templates_A05_Primer-G.ab1 > A05_Grammatophyllum_scriptum_ITS1.ab1
    5-3-13-G-Templates_B05_Primer-G.ab1 > B05_Grammatophyllum_scriptum_ITS4.ab1
    ...