Проход через ftp-каталоги в python

Я пытаюсь загрузить несколько папок с ftp-сервера с Python 3, используя ftplib.

У меня есть список имен папок. Все они находятся в папке «root». Проблема в том, что я не знаю, как ориентироваться в них. Когда я использую cwd, я могу перейти в более глубокий каталог, но как мне снова встать?

Я пытаюсь получить что-то вроде

list = ["folder1", "folder2", "folder3"]
for folder in list:
   ##navigate to folder
   ##do something

person wasmachien    schedule 22.03.2014    source источник
comment
ftp_object.cwd('..') поднимает вас на один каталог вверх.   -  person anon582847382    schedule 22.03.2014


Ответы (2)


Вы можете получить текущий каталог, используя метод FTP.pwd. Запомните этот каталог перед изменением каталога.

parent_dir = ftp_object.pwd()
list = ["folder1", "folder2", "folder3"]
for folder in list:
    ftp_object.cwd('{}/{}'.format(parent_dir, folder))
ftp_object.cwd(parent_dir) # go to parent directory
person falsetru    schedule 22.03.2014

Я внес некоторые изменения в код, который нашел здесь

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

Пожалуйста, дайте мне знать, если это работает. Мне интересно, следует ли мне «положить это в задний карман» и сохранить на внешний жесткий диск.

    #!/usr/bin/python

import sys
import ftplib
import urllib.request
import os
import time
import errno

server = "ftp.analog.com"
#user = ""
#password = ""
source = "/pub/MicroConverter/ADuCM36x/"
destination0 = "C:/NewFolder/" # YOU HAVE TO UT THIS NEW FOLDER IN C: BEFORE RUNNING
interval = 0.05

ftp = ftplib.FTP(server)
ftp.login()#(user, password)

count = 0 #We need this variable to make the first folder correctly

def downloadFiles(path, destination):
    try:
        ftp.cwd(path)       
        os.chdir(destination)
        mkdir_p(destination[0:len(destination)-1] + path)
        print ("Created: " + destination[0:len(destination)-1] + path )
    except OSError:     
        pass
    except ftplib.error_perm:       
        print ( "Error: could not change to " + path )
        sys.exit("Ending Application")

    filelist=ftp.nlst()

    print(filelist)


    for file in filelist:
        time.sleep(interval)

        if "." in file :
            url = ("ftp://" + server + path + file)
            urllib.request.urlretrieve(url, destination + path + file)

        else:
            try:            
                ftp.cwd(path + file + "/")


                downloadFiles(path + file + "/", destination)
            except ftplib.error_perm:
                os.chdir(destination[0:len(destination)-1] + path)

                try:
                    ftp.retrbinary("RETR " + file, open(os.path.join(destination + path, file),"wb").write)
                    print ("Downloaded: " + file)
                except:
                    print ("Error: File could not be downloaded " + file)

    return


def mkdir_p(path):
    try:
        os.makedirs(path)
    except OSError as exc:
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            pass
        else:
            raise


downloadFiles(source, destination0)

#ftp.quit()
person elscan    schedule 21.02.2019
comment
Обычно не одобряют просто дать вопрошающему полный код. Тем не менее, было бы полезно добавить некоторые подробности о том, почему ваш код может быть лучшей альтернативой. - person Frontear; 21.02.2019