Форум сайта python.su
Уважаемые знатоки питона, прошу вашей помощи…
С питоном знаком буквально неделю (до этого программированием занимался только в университете, выполняя лабораторные, да и то они были на С++), а на работе задали задачку.
Имеется корневая папка, в ней n-ое количество подпапок (с файлами внутри) и в этих подпапках (с файлами внутри) также есть папки и т.д. (с файлами внутри). В названии папок (не во всех) присутствует знак “#”. Задача состоит в том, чтобы пробежаться по всем имеющимся вложенным папкам в корневом каталоге, найти папки в имени которых встречается знак “#” и убрать его из названия, при этом учитывая такой момент, если в папке, где сейчас происходит поиск есть папки “dir” и “dir#”, то папку “dir#” переименовать в “dir1”.
Знак “#” может встречаться в любом месте в названии папки.
Подскажите, пожалуйста, какие функции можно использовать для реализации данной задачи, какие библиотеки подключать и т.д., если кто-то уже подобное делал и имеется готовый код - буду очень благодарен за помощь.
Направьте, пожалуйста, на путь истинный.
Офлайн
Я тут уже приводил функцию рекурсивного копирования файлов http://python.su/forum/topic/5393/?page=1#post-34988 Замените копирование переименованием и будет вам счастье.
Офлайн
пробежатся по папка - в модуле os функции walk
понять есть ли символ в названии - if ‘#’ in filename
заменить в строке символ - метод replace
переименовать файл - модуль os функция rename
Офлайн
SunIsUpА если папка или файл “dir1” есть, то надо делать “dir2” и так далее. Не такая простая задача, есть у неё подводные камни. Там ещё это переименование надо делать на выходе из папки (когда внутри неё всё обработано), тогда как os.walk() выдаёт пути в прямом порядке и является генератором зависящих друг от друга путей, а генераторы нельзя менять в середине. А на выходе из папки ты можешь уже не иметь остальных имён по соседству, чтобы с ними можно было сравнить новое имя. Так что есть над чем подумать. (Проверил os.walk() с переименованием директорий в процессе прохода. Если так переименовывать, то оно переименовывает, но сам проход ломается.)
то папку “dir#” переименовать в “dir1”
Офлайн
ИХМО walk это костыль для слабаков. Для обхода деревьев нужно использовать рекурсию. Это правильно.
Офлайн
RodegastСпасибо, сейчас буду изучать
http://python.su/forum/topic/5393/?page=1#post-34988 Замените копирование переименованием и будет вам счастье.
('C:\\Python', ['#test'], ['derevo.py', 'fso.py', 'proba.py', 'test.py']) ('C:\\Python\\#test', [], ['test.txt'])
Отредактировано SunIsUp (Июнь 8, 2017 14:24:20)
Офлайн
Господа, добрый день.
Не совсем разобрался с рекурсией, которую предложил Rodegast. Остановился на варианте, предложенном JOHN_16, но возникает ошибка (и вдобавок надо добавить в код проверку на наличие папок с таким именем в директории перед переименованием)
import os pdir = 'D://test' for d, dirs, files in os.walk(pdir): for f in dirs: if '#' in f: print (f) ff = f.replace('#', '') print (ff) # fff = os.rename(f , ff) # print (fff)
Traceback (most recent call last): File "C:\Python\gotovo.py", line 11, in <module> fff = os.rename(f , ff) FileNotFoundError: [WinError 2] Не удается найти указанный файл: '#test' -> 'test'
SunIsUp
при этом учитывая такой момент, если в папке, где сейчас происходит поиск есть папки “dir” и “dir#”, то папку “dir#” переименовать в “dir1”.
Отредактировано SunIsUp (Июнь 8, 2017 14:25:16)
Офлайн
Ура! Переименование получилось!!!
import os pdir = 'D:\\test' for d, dirs, files in os.walk(pdir): for f in dirs: if '#' in f: print (f) ff = f.replace('#', '') print (ff) print (d) fff = os.rename(d+'\\'+f , d+'\\'+ff) print (fff)
SunIsUp
если в папке, где сейчас происходит поиск есть папки “dir” и “dir#”, то папку “dir#” переименовать в “dir1”.
Офлайн
SunIsUp
Подскажите, пожалуйста, как теперь выцепить момент …
ff = f.replace('#', '') count = 0 path = os.path.join(d, ff) while os.path.exists(path): count += 1 path = os.path.join(d, ff+str(count))
[code python][/code]
Отредактировано PEHDOM (Июнь 8, 2017 22:01:48)
Офлайн