如何根据.CSVMap重命名文件

n53p2ov0  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(113)

数据科学路障在这里…我需要重命名972文件根据一个.csv文件,有这些972文件的多个属性。
它们有一个共同点,那就是Image Data ID列的值。在文件名中,这个数字(6位数)出现在名称的最后一部分,就在“.nii”之前
我已将.csv文件加载到Pandas数据库中。下面是一个例子,它看起来像什么:

Image Data ID   Subject Group   Visit   Description
516 277576  027_S_2245  EMCI    4   ACCELERATED SAG IR-SPGR
525 342645  027_S_2183  EMCI    4   ACCELERATED SAG IR-SPGR
1   292394  131_S_0123  CN  26  Accelerated SAG IR-SPGR
3   475763  131_S_0123  CN  32  Accelerated SAG IR-SPGR
4   413872  131_S_0123  CN  30  Accelerated SAG IR-SPGR

字符串
也许用图像格式更容易理解:


的数据
文件名列在一个列表中,使用以下命令完成:

files = os.listdir("path/to/files")


下面是文件名的示例:

ADNI_098_S_4215_MR_Sag_IR-SPGR__br_raw_20130206130502189_10_S173103_I343697.nii
ADNI_094_S_2201_MR_Accelerated_SAG_IR-SPGR__br_raw_20120119112855332_188_S137442_I279199.nii
ADNI_127_S_4240_MR_Sag_IR-SPGR__br_raw_20120925151831011_194_S168683_I336697.nii


因此,本质上,我想做的是通过Image Data ID的值在其各自的.CSV行中识别文件,并将其重命名为:

EMCI_027_S_2245_4_Accelerated.nii


CN_134_S_0233_32_Normal.nii


(取决于Description是否有加速字样)
有什么建议吗?

2skhul33

2skhul331#

从我所看到的,这是我的建议:

  • 创建一个函数,从文件的old_name中提取image_data_id(如果你所有的id都是相同的大小(我在这里看到的大小是6),你可以使用name_file[-11,-5]从名为name_file的字符串中提取id,如果不是,你可以使用regex(找到I和.nii之间的数字))。让我们调用这个函数id_from_file_name。
  • 现在让我们调用df_id通过加载csv文件获得的 Dataframe 。执行
import os
df_calc = df_id.set_index('Image_Data_Id')

def new_name_file(old_name):
    id = id_from_file_name(old_name)
    # Edit : Related to first comment, changed id to int(id)
    if int(id) not in df_calc.index:
        print( id, 'not in dataframe')
        return None
    if 'accelerated' in df_calc.loc[id, 'Description'].lower():
        type = 'Accelerated'
    else:
        type = 'Normal'
    return(f'{df_calc.loc[id,'Group']}_{df_calc.loc[id,'Subject']}_{df_calc.loc[id,'Visit']}_{type}.nii')

list_name = os.listdir(path)
for i in list_name:
    new_name = new_name_file(i)
    if new_name is not None:
        os.rename(path/old_name, path/dict_name(old_name))

字符串
编辑:要创建函数id_from_file_name,您可以执行以下操作:

import re
def id_from_file_name(name):
    return(re.search(r'I(.*?).nii', name).group(1))

pengsaosao

pengsaosao2#

-用简单的脚本新的答案-

在MacOS上测试:
只需将您的2列导出到名为map.csv的文件中,并将其格式设置为:

old_file1.txt,new_file1.txt
old_file2.txt,new_file2.txt
old_file3.txt,new_file3.txt

字符串
创建shell脚本rename.sh并更改变量folder_path、csv_file和file_extension:

#!/bin/bash

folder_path="path/to/your/files/"
csv_file="path/to/map/file/map.csv"
file_extension=".jpg"

while IFS=',' read -r old_file new_file
do
  mv "${folder_path}/${old_file}${file_extension}" "${folder_path}/${new_file}${file_extension}"
  echo "File ${old_file}${file_extension} renamed to ${new_file}${file_extension}."
done < "$csv_file"


sh rename.sh启动脚本
“魔术师,你来吧。- )

相关问题