0

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

csv 是制表符分隔的,如下所示:(96 孔,12 列 [1-12],8 行 [AH]):

1   2   3   4   5   6   7   8   9   10  11  12
A01 A02 A03 A04 A05_Grammatophyllum_scriptum_ITS1   A06_Eulophia_euglossa_ITS1  A07_Grammatophyllum_scriptum_17SE   A08_Graphorkis_lurida_X502F A09_Cymbidium_kanran_X502F  A10_Claderia_viridiflora_X502F  A11_Grammatophyllum_scriptum_X502F  A12_Eulophia_euglossa_X502F
B01 B02 B03 B04 B05_Grammatophyllum_scriptum_ITS4   B06_Eulophia_euglossa_ITS4  B07_Grammatophyllum_scriptum_1229R  B08_Graphorkis_lurida_X1599R    B09_Cymbidium_kanran_X1599R B10_Claderia_viridiflora_X1599R B11_Grammatophyllum_scriptum_X1599R B12_Eulophia_euglossa_X1599R
C01 C02 C03 C04 C05_Acriopsis_ridleyi_ITS1  C06_Cyrtopodium_polyphyllum_ITS1    C07_Cyrtopodium_polyphyllum_17SE    C08_Graphorkis_scripta_X502F    C09_Dipodium_conduplicatum_X502F    C10_Dipodium_5431_X502F C11_Cyrtopodium_polyphyllum_X502F   C12_Oeceoclades_gracillima_X502F
D01 D02 D03 D04 D05_Acriopsis_ridleyi_641R  D06_Cyrtopodium_polyphyllum_ITS4    D07_Cyrtopodium_polyphyllum_1229R   D08_Graphorkis_scripta_X1599R   D09_Dipodium_conduplicatum_X1599R   D10_Dipodium_5431_X1599R    D11_Cyrtopodium_polyphyllum_X1599R  D12_Oeceoclades_gracillima_X1599R
E01 E02 E03 E04_Dipodium_6052_ITS1  E05_Dipodium_5431_ITS1  E06_Bromheadia_finlaysoniana_ITS1   E07_Dressleria_dilecta_X502F    E08_Cyrtopodium_falciobum_X502F E09_Acriopsis_ridleyi_X502F E10_Dipodium_6052_X502F E11_Thecostele_alata_28_X502F   E12_Thecostele_alata_32_X502F
F01 F02 F03 F04_Dipodium_6052_ITS4  F05_Dipodium_5431_ITS4  F06_Bromheadia_finlaysoniana_641R   F07_Dressleria_dilecta_X1599R   F08_Cyrtopodium_falciobum_X1599R    F09_Acriopsis_ridleyi_X1599R    F10_Dipodium_6052_X1599R    F11_Thecostele_alata_28_X1599R  F12_Thecostele_alata_32_X1599R
G01 G02 G03 G04_Dipodium_6055_ITS1  G05_Dipodium_conduplicatum_ITS1 G06_Claderia_viridiflora_ITS1   G07_Ansellia_africana_X502F G08_Grammangis_ellisii_X502F    G09_Bromheadia_finlaysoniana_X502F  G10_Dipodium_6055_X502F G11_Grammatophyllum_stapeliiflorum_X502F    G12
H01 H02 H03 H04_Dipodium_6055_ITS4  H05_Dipodium_conduplicatum_ITS4 H06_Claderia_viridiflora_641R   H07_Ansellia_africana_X1599R    H08_Grammangis_ellisii_X1599R   H09_Bromheadia_finlaysoniana_X1599R H10_Dipodium_6055_X1599R    H11_Grammatophyllum_stapeliiflorum_X1599R   H12

每次我手动取回一个盘子时,我都没有花时间重命名 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 没有其他标签)

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
...
4

1 回答 1

1
  1. 处理 CSV 文件,收集所有新文件名并制作从样本 ID 到新名称的映射。

  2. id_map浏览目录,找到所有文件,从它们的基本名称中提取示例 ID,并从第一步创建的名称中查找新名称。根据新名称重命名。

import csv
import os
import re

# First
data = csv.DictReader(open('csv.csv', 'r'), delimiter = "\t")
id_map = {}
for row in data:
    for name in row.values():
        # find all sample IDs as a list in the cell, should only get 1 ID
        ids = re.findall(r'[A-H][0-9]{2}', name)
        if len(ids) != 1:
            print "Confused at " + name
        id_map[ids[0]] = name

# Second
folder = 'files/'
for root, dirs, files in os.walk(folder):
    for filename in files:
        fullname = os.path.join(root, filename)
        basename, extension = os.path.splitext(filename)
        # find all sample IDs in the basename, should only get 1 ID
        ids = re.findall(r'[A-H][0-9]{2}', basename)
        if len(ids) != 1:
            print "Confused at " + os.path.join(root, filename)
        if ids[0] in id_map:
            new_name = id_map[ids[0]] + extension
            os.rename(fullname, os.path.join(root, new_name))
        else:
            print "New name for " + fullname + " not found"
于 2013-06-01T04:47:06.203 回答