Используя Python, как загрузить несколько файлов из подкаталога на FTP-сервере в нужный каталог на локальном компьютере?

Используя программу python, я смог загрузить несколько исходных файлов с FTP-сервера (используя библиотеки ftplib и os) на свой локальный компьютер.

Эти исходные файлы находятся в определенном каталоге внутри FTP-сервера.

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

Я могу загрузить файлы в C:\data\abc\transfer, который совпадает с удаленным каталогом /data/abc/transfer. Код настаивает на том, чтобы я предоставил тот же каталог.

Но я хочу загрузить все файлы в нужный каталог C:\data_download\

Ниже приведен код:

import ftplib
import os
from ftplib import FTP

Ftp_Server_host = '[email protected]'
Ftp_username ='qsdfg12'
Ftp_password = 'xxxxx'
Ftp_source_files_path = '/data/abc/transfer/'

ftp = FTP(Ftp_Server_host)
ftp.login(user=Ftp_username, passwd=Ftp_password)
local_path = 'C:\\data_download\\'
print("connected to remote server :" + Ftp_Server_host)
print()
ftp_clnt = ftp_ssh.open_sftp()
ftp_clnt.chdir(Ftp_source_files_path)
print("current directory of source file in remote server :" +ftp_clnt.getcwd())
print()

files_list = ftp.nlst(Ftp_source_files_path)
for file in files_list:
    print("local_path :" + local_path)
    local_fn = os.path.join(local_path)
    print(local_fn)
    print('Downloading files from remote server :' + file)
    local_file = open (local_fn, "wb")
    ftp.retrbinary("RETR " + file, local_file.write)
    local_file.close()
    print()

print("respective files got downloaded")
print()
ftp_clnt.close()

исходный вывод

ожидаемый результат


person Mech_Saran    schedule 19.05.2020    source источник


Ответы (1)


Вы должны указать полный путь к функции open, а не только имя каталога.

Чтобы собрать полный локальный путь, возьмите имя файла из удаленных путей, возвращенных ftp.nlst, и объедините их с путем к целевому локальному каталогу.

Как это:

local_fn = os.path.join(local_path, os.path.basename(file))
person Martin Prikryl    schedule 19.05.2020
comment
это сработало, большое спасибо .. код работает успешно, и результаты удовлетворительны .. еще раз спасибо. - person Mech_Saran; 19.05.2020