Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Центр помощи
  • » Необходима помощь в переименовании папок, нужно убрать "#" из названий папок [RSS Feed]

#1 Июнь 7, 2017 11:54:04

SunIsUp
Зарегистрирован: 2017-06-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Необходима помощь в переименовании папок, нужно убрать "#" из названий папок

Уважаемые знатоки питона, прошу вашей помощи…

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

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

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

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

Направьте, пожалуйста, на путь истинный.

Офлайн

#2 Июнь 7, 2017 12:41:26

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2762
Репутация: +  185  -
Профиль   Отправить e-mail  

Необходима помощь в переименовании папок, нужно убрать "#" из названий папок

Я тут уже приводил функцию рекурсивного копирования файлов http://python.su/forum/topic/5393/?page=1#post-34988 Замените копирование переименованием и будет вам счастье.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Июнь 7, 2017 13:30:46

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Необходима помощь в переименовании папок, нужно убрать "#" из названий папок

пробежатся по папка - в модуле os функции walk
понять есть ли символ в названии - if ‘#’ in filename
заменить в строке символ - метод replace
переименовать файл - модуль os функция rename



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Июнь 7, 2017 14:32:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9894
Репутация: +  854  -
Профиль   Отправить e-mail  

Необходима помощь в переименовании папок, нужно убрать "#" из названий папок

SunIsUp
то папку “dir#” переименовать в “dir1”
А если папка или файл “dir1” есть, то надо делать “dir2” и так далее. Не такая простая задача, есть у неё подводные камни. Там ещё это переименование надо делать на выходе из папки (когда внутри неё всё обработано), тогда как os.walk() выдаёт пути в прямом порядке и является генератором зависящих друг от друга путей, а генераторы нельзя менять в середине. А на выходе из папки ты можешь уже не иметь остальных имён по соседству, чтобы с ними можно было сравнить новое имя. Так что есть над чем подумать. (Проверил os.walk() с переименованием директорий в процессе прохода. Если так переименовывать, то оно переименовывает, но сам проход ломается.)



Офлайн

#5 Июнь 7, 2017 14:45:08

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2762
Репутация: +  185  -
Профиль   Отправить e-mail  

Необходима помощь в переименовании папок, нужно убрать "#" из названий папок

ИХМО walk это костыль для слабаков. Для обхода деревьев нужно использовать рекурсию. Это правильно.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Июнь 7, 2017 15:08:58

SunIsUp
Зарегистрирован: 2017-06-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Необходима помощь в переименовании папок, нужно убрать "#" из названий папок

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 (Июнь 8, 2017 14:24:20)

Офлайн

#7 Июнь 8, 2017 14:22:38

SunIsUp
Зарегистрирован: 2017-06-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Необходима помощь в переименовании папок, нужно убрать "#" из названий папок

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

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

Офлайн

#8 Июнь 8, 2017 14:52:05

SunIsUp
Зарегистрирован: 2017-06-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Необходима помощь в переименовании папок, нужно убрать "#" из названий папок

Ура! Переименование получилось!!!

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

Офлайн

#9 Июнь 8, 2017 19:54:26

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Необходима помощь в переименовании папок, нужно убрать "#" из названий папок

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)

Офлайн

  • Начало
  • » Центр помощи
  • » Необходима помощь в переименовании папок, нужно убрать "#" из названий папок[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version