Найти - Пользователи
Полная версия: Необходима помощь в переименовании папок, нужно убрать "#" из названий папок
Начало » Центр помощи » Необходима помощь в переименовании папок, нужно убрать "#" из названий папок
1
SunIsUp
Уважаемые знатоки питона, прошу вашей помощи…

С питоном знаком буквально неделю (до этого программированием занимался только в университете, выполняя лабораторные, да и то они были на С++), а на работе задали задачку.

Имеется корневая папка, в ней n-ое количество подпапок (с файлами внутри) и в этих подпапках (с файлами внутри) также есть папки и т.д. (с файлами внутри). В названии папок (не во всех) присутствует знак “#”. Задача состоит в том, чтобы пробежаться по всем имеющимся вложенным папкам в корневом каталоге, найти папки в имени которых встречается знак “#” и убрать его из названия, при этом учитывая такой момент, если в папке, где сейчас происходит поиск есть папки “dir” и “dir#”, то папку “dir#” переименовать в “dir1”.

Знак “#” может встречаться в любом месте в названии папки.

Подскажите, пожалуйста, какие функции можно использовать для реализации данной задачи, какие библиотеки подключать и т.д., если кто-то уже подобное делал и имеется готовый код - буду очень благодарен за помощь.

Направьте, пожалуйста, на путь истинный.
Rodegast
Я тут уже приводил функцию рекурсивного копирования файлов http://python.su/forum/topic/5393/?page=1#post-34988 Замените копирование переименованием и будет вам счастье.
JOHN_16
пробежатся по папка - в модуле os функции walk
понять есть ли символ в названии - if ‘#’ in filename
заменить в строке символ - метод replace
переименовать файл - модуль os функция rename
py.user.next
SunIsUp
то папку “dir#” переименовать в “dir1”
А если папка или файл “dir1” есть, то надо делать “dir2” и так далее. Не такая простая задача, есть у неё подводные камни. Там ещё это переименование надо делать на выходе из папки (когда внутри неё всё обработано), тогда как os.walk() выдаёт пути в прямом порядке и является генератором зависящих друг от друга путей, а генераторы нельзя менять в середине. А на выходе из папки ты можешь уже не иметь остальных имён по соседству, чтобы с ними можно было сравнить новое имя. Так что есть над чем подумать. (Проверил os.walk() с переименованием директорий в процессе прохода. Если так переименовывать, то оно переименовывает, но сам проход ломается.)
Rodegast
ИХМО walk это костыль для слабаков. Для обхода деревьев нужно использовать рекурсию. Это правильно.
SunIsUp
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'])
Вот что-то типо такого есть на экране, при запуске os.walk

И ещё вопрос: можно ли подключить библиотеку FileSystemObject (в универе просто была какая-то лабораторная, где её использовали для работы с папками, правда в визуалбейсике) к питону и сделать через неё? Или всё же лучше использовать то, что посоветовал Rodegast?

Всем спасибо за ответы! Благодарю за уделённое время. Как скрипт будет готов или ещё будут вопрос при ознакомлении с материалом по предложенной ссылке - отпишусь в теме.

SunIsUp
Господа, добрый день.

Не совсем разобрался с рекурсией, которую предложил 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
Ура! Переименование получилось!!!

 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”.
PEHDOM
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))
    
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB