Модераторы: pythonwin, Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FTP, ftplib - как удалить директорию с файл. 
:(
    Опции темы
OzMod
  Дата 20.3.2019, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.1.2014

Репутация: нет
Всего: 1



ftplib - как удалить директорию с папками и файлами,
а не просто файл или пустую папку...

Зарание спасибо !
PM MAIL   Вверх
Romikgy
Дата 21.3.2019, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7270
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 143



FTP.rmd(dirname)¶
Remove the directory named dirname on the server.

возможно понадобиться рекурсивное удаление всех файлов внутри директории 
FTP.delete(filename)¶



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
OzMod
  Дата 27.3.2019, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.1.2014

Репутация: нет
Всего: 1



Romikgy

А примерчик небольшой можно ?
Скажем мне нужно удалить эту директорию (Папка 1), а в ней лежит следующее...

Папка 1 - (надо её удалить)
    |---- файл 1 - (а в ней файл 1)
    |---- папка 2 - (там же папка 2)
            |---- файл 2 - (а в папке 2 , файл-2)


Как удалить папку 1 , я конечно могу скажем зайти в каждую папку по удалить оттуда файлы, а потом следом и папки...


Это сообщение отредактировал(а) OzMod - 27.3.2019, 09:59
PM MAIL   Вверх
baldman88
  Дата 29.3.2019, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 18.1.2009

Репутация: 2
Всего: 7



Цитата
я конечно могу скажем зайти в каждую папку по удалить оттуда файлы, а потом следом и папки...

Да. Как заметили выше, и как Вы сами догадались, удалять нужно рекурсивно. Во примерный код:
Код
#import ftplib
#import os

ftp = ftplib.FTP('ftp.youserver.name')

def rmtree(ftp, path):
    names = ftp.nlst(path)
    for name in names:
        if os.path.split(name)[1] in ('.', '..'):
            continue
        ftp.cwd(name)
        if ftp.pwd() != path:
            ftp.cwd(path)
            rmtree(ftp, name)
        else:
            ftp.delete(name)
    ftp.rmd(path)

Код не проверял, и на Python вообще давно не писал, так что пример, скорее всего, не будет работать. Но суть должна быть ясна. По хорошему вместо if ... else, нужно использовать try ... catch smile

Это сообщение отредактировал(а) baldman88 - 29.3.2019, 02:26
PM MAIL   Вверх
OzMod
  Дата 30.3.2019, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.1.2014

Репутация: нет
Всего: 1



baldman88
Доброго времени суток...
Как вы и сказали ваш пример не работает...
---------------------------------------------------------------
Может у вас есть еще какие мысли как это можно сделать...
Может НА python есть еще какие нибудь библиотеки для работы с FTP?..
--------------------------------------------------------------------------------------
Можно конкретный пример, скажем...
ftp = ftplib.FTP(192.168.0.77)  # скажем по локальному IP
ftp.login(user , passwd)
ftp.cwd("OzFILES") #путь - В этой директории, есть папка скажем (TEMP, в ней папка garbage в которой файл remove.txt)
-----------------------------------------------------
TEMP - (надо её удалить)
    |---- garbage  - (там папка garbage)
            |---- remove.txt - (а в ней, файл - remove.txt)



Это сообщение отредактировал(а) OzMod - 30.3.2019, 17:23
PM MAIL   Вверх
baldman88
Дата 7.4.2019, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 18.1.2009

Репутация: 2
Всего: 7



Да, пример не рабочий от слова совсем  smile 

У меня нет на чем проверить с удалением, но вот такой пример работает:

Код
import ftplib

ftp = ftplib.FTP('85.143.112.112')
ftp.login('anonymous', '')

def check_items(ftp, path):
    current_path = ftp.pwd()
    names = ftp.nlst(path)
    for name in names:
        try:
            ftp.cwd(name)
            print(name + ' is a directory')
            ftp.cwd(current_path)
            check_items(ftp, name)
        except ftplib.error_perm:
            print(name + ' is a file')

check_items(ftp, 'debian/doc')


По идее, следующее тоже должно работать:

Код
import ftplib

ftp = ftplib.FTP('192.168.0.77')
ftp.login('user', 'passwd')

def rmtree(ftp, path):
    # обязательно сохраняем путь к рабочей директории, из которой запускаетя функция, так как работать будем с относительными путями
    current_path = ftp.pwd()
    names = ftp.nlst(path)
    for name in names:
        # пробуем зайти, если это директория, то все хорошо, иначе получим исключение
        try:
            ftp.cwd(name)
            # если получилось зайти, то это директория -- идем в рабочую директорию
            ftp.cwd(current_path)
            # запускаем функцию еще раз для этого пути
            rmtree(ftp, name)
        # если получили исключение, значит это не директория -- удаляем
        except ftplib.error_perm:
            ftp.delete(name)
        # здесь еще можно, на всякий случай, ловить все остальные исключения, например:
        #except ftplib.all_errors:
        #    print('Some error ...')
        #    return

    # на всякий случай, удалять пустую директорию будем в секции try, а то мало ли
    try:
        # удаляем пустую директорию
        ftp.rmd(path)
    except ftplib.all_errors:
        pass

# обязательно нужно вызывать из родительской для OzFILES директории
rmtree(ftp, 'OzFILES/TEMP')


Как-то так.

Это сообщение отредактировал(а) baldman88 - 7.4.2019, 15:42
PM MAIL   Вверх
Google
  Дата 24.4.2019, 01:42 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.