Как переименовать файлы в соответствии с картой .CSV - PullRequest
0 голосов
/ 13 декабря 2018

Блокировка данных науки здесь ... Мне нужно переименовать 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

Возможно, более понятно в формате изображения:

enter image description here

Имена файлов:перечислены в списке, с помощью:

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

Таким образом, по сути, я хочу определить файлв соответствующей строке .CSV введите значение Image Data ID и переименуйте его следующим образом:

EMCI_027_S_2245_4_Accelerated.nii

или

CN_134_S_0233_32_Normal.nii

(В зависимости от того, есть ли в Description слово «Ускорено» или нет)

Есть предложения, как к этому подойти?

1 Ответ

0 голосов
/ 13 декабря 2018

Из того, что я вижу, я бы предложил следующее:

-Сделайте функцию, которая извлекает image_data_id из old_name файла (если все ваши идентификаторы имеют одинаковый размер (размер 6 от того, чтоя могу видеть здесь), вы можете сделать name_file [-11, -5], чтобы извлечь идентификатор из строки с именем name_file, если нет, вы можете сделать регулярное выражение (найдите число между I и .nii)).Давайте назовем эту функцию id_from_file_name.

-Теперь давайте назовем df_id фрейм данных, полученный при загрузке вашего CSV-файла.Do

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