Пакетное переименование файлов и папок в Python с использованием f.replace () и os.rename () внутри os.walk () - PullRequest
0 голосов
/ 17 октября 2018

У меня есть база данных со следующей структурой:

dataset1
- subject-1
    - session-1
        - group1
            - subject-1_session-1_other-stuff-01.json
            - subject-1_session-1_other-stuff-01.txt
            - subject-1_session-1_other-stuff-02.json
            - subject-1_session-1_other-stuff-02.txt
        - group2
            - files-i-dont-care-about.bvec
        - group3
            - subject-1_session-1_other-different-stuff-01.json
            - subject-1_session-1_other-different-stuff-01.txt
            - subject-1_session-1_other-different-stuff-02.json
            - subject-1_session-1_other-different-stuff-02.txt
    - session2
        - group1
            - subject-1_session-2_other-stuff-01.json
            - subject-1_session-2_other-stuff-01.txt
            - subject-1_session-2_other-stuff-02.json
            - subject-1_session-2_other-stuff-02.txt
        - group2
            - differently-named-files-i-dont-care-about.bvec
        - group3
            - subject-1_session-2_other-different-stuff-01.bval
            - subject-1_session-2_other-different-stuff-01.bvec
            - subject-1_session-2_other-different-stuff-02.bval
            - subject-1_session-2_other-different-stuff-02.bvac
- subject-2 
       - ^ etc

Я хочу удалить начало файлов (subject-x_session-x_) и сохранить остальные вещи *. * И другие-разные-материал *. * и так далее.Я использую * здесь как расширение UNIX, но не уверен, смогу ли я использовать это внутри переменной в качестве ввода.Я думаю, что одна проблема заключается в том, что когда скрипт пытается разместить новые имена файлов в правильном каталоге, каталог не динамически направляет к источнику файла.Надеюсь, я все еще могу использовать os.walk (), но похоже, что эта функция извлекает массив сразу и заканчивается, прежде чем я могу вызвать os.rename ().Я думаю, что мне нужно иметь возможность вызывать os.rename () кусочно до завершения os.walk ().В противном случае мне нужно запустить скрипт в каждом конкретном каталоге, чтобы изменить имена, но это большая база данных.Вот с чего я начинаю:

root = /full-path/database/
find = "subject-1" 
# ^ ideally this would find any string starting with subject-{any number}_session-{any number} but I'd be happy just to get the explicit string to work

replace_with = ""

list = os.walk(root)

for root, dirs, files in list:
    for file in files:

            new_filename = file.replace(find, replace_with)
            src = os.path.join(root, file) 
            dst = os.path.join(root, new_filename)
            os.rename(src, dst)
            print(filename + " renamed to " + new_filename)

Сценарий завершается ошибкой при установке ОС.Переименование () называется.Разумно ли перебирать каталог различной глубины и менять эти файлы за один раз?

Я думаю, что-то вроде функции карты или нескольких циклов for внутри большего, но я столкнулся со стеной..

...