Форум сайта python.su
0
Цель :
-Рекурсивное скачивание каталога и всего его содержимого с FTP
-Программа должна скачивать все содержимое указного каталога FTP не подымаясь выше .
-Должен вестись лог
-После загрузки файлов должна происходить сверка размеров (размер файла на локальном диске , должен быть равен размеру файла на ФТП)
На данный момент получилось следующее , программа скачивает только один файл.
import os import ftplib from ftplib import FTP def GET_Folder_from_FTP_2(host,cwd,local_folder,username="",password=""): ftp = FTP(host) ftp.login(user= username, passwd = password) ftp.cwd(cwd) filenames = ftp.nlst() for filename in filenames: host_file = os.path.join(local_folder,filename) try: with open(host_file, 'wb') as local_file: ftp.retrbinary('RETR ' + filename,local_file.write) except ftplib.error_perm: pass ftp.quit() GET_Folder_from_FTP_2("ftp.ru.debian.org/debian/dists/Debian9.5/","Debian9.5")
Отредактировано VIRTOK (Окт. 12, 2018 17:37:04)
Офлайн
221
VIRTOK
Вам уже указывали на то что вы не очен..корректно формируете стартовое сообщение. Это информативное сообщение,а предполагается вопросительное.
Офлайн
from ftplib import FTP ftp = FTP('ftp.ru.debian.org') ftp.login() ftp.cwd('debian/dists/Debian9.5') print('nlst',ftp.nlst()) print(ftp.retrlines('LIST')) ftp.quit()
nlst ['ChangeLog', 'ChangeLog~', 'Release', 'Release.gpg', 'contrib', 'main', 'non-free'] -rw-r--r-- 1 ftp ftp 1139019 Jul 14 08:57 ChangeLog -rw-r--r-- 1 ftp ftp 1096776 Jul 14 08:44 ChangeLog~ lrwxrwxrwx 1 ftp ftp 30 Jun 17 2017 Release -> ../../zzz-dists/stable/Release lrwxrwxrwx 1 ftp ftp 34 Jun 17 2017 Release.gpg -> ../../zzz-dists/stable/Release.gpg drwxr-xr-x 18 ftp ftp 4096 Jul 14 09:44 contrib drwxr-xr-x 28 ftp ftp 4096 Jul 14 09:44 main drwxr-xr-x 18 ftp ftp 4096 Jul 14 09:44 non-free 226 Directory send OK.
Обратите внимание на то, что команда nlst не указывает нам на то, как выполнять дифференциацию между файлами и каталогами из её результатов. Хотя в данном примере это не так уж и важно. Это относится к более сложным скриптам. В любом случае, данная команда зациклится над выданным списком и попробует скачать файлы. Если так вышло, что наш «файл» на самом деле является каталогом, то мы получим пустой файл на нашем диске с тем же названием, что и у каталога на FTP сервере. Также существует команда MLSD, которую вы можете вызвать при помощи метода mlsd, но её поддерживают не все FTP сервера. А с теми, которые поддерживают, вы можете заметить различия между ними.
Офлайн
для примера
from ftplib import FTP ftp = FTP('ftp.debian.ru') print (ftp.login()) ftp.cwd('debian/dists/Debian9.5') files = ftp.nlst() for i in files: try: ftp.retrbinary("RETR " + i , open(i,'wb').write) print('OK', i) except Exception as e: print(i, e) ftp.quit()
230 Login successful. OK ChangeLog OK ChangeLog~ OK Release OK Release.gpg contrib 550 Failed to open file. main 550 Failed to open file. non-free 550 Failed to open file.
Офлайн
857
VIRTOKНужно как минимум три функции: 1) функция чтения содержимого заданной директории на ftp-сервере; 2) функция скачивания заданного файла с ftp-сервера; 3) функция, управляющая первыми двумя функциями.
На данный момент получилось следующее , программа скачивает только один файл.
Отредактировано py.user.next (Окт. 13, 2018 00:36:22)
Офлайн
0
Задача решена частично
def GET_Folder_from_FTP(FTP_url_resource,FTP_folder_path,Save_folder_from_ftp_to_folder,ftp_login="",ftp_password=""): wget= str(LocalDir+"\\Tools\\wget.exe")#Путь где расположен wget # ftp_login="" # Логин ФТП # ftp_password="" # Пароль ФТП # FTP_url_resource="http://ftp.ru.debian.org/" # адрес FTP сервера # FTP_folder_path="debian/dists/Debian9.5/main/binary-amd64/" # путь к каталогу на FTP #FTP_Link_to_get_Folder=FTP_url_resource+FTP_folder_path # полный путь к каталогу на FTP # Save_folder_from_ftp_to_folder="build" # Каталог куда будет сохранены файлы с FTP Connect_FTP_to_get_file=str(wget +" -r --no-parent"+" --user="+ftp_login+" --password="+ftp_password+" "+"-P" +" " + LocalDir + "\\"+ Save_folder_from_ftp_to_folder+" " +FTP_url_resource+":22"+FTP_folder_path+" "+"-o "+LocalDir+"\\Logs\\"+"log.txt")# Строка соединения с FTP включающая все требуемые параметры print(Connect_FTP_to_get_file) # если расконсервировать данную строку то можно удивить строку соединения с FTP с всеми параметрами os.system(Connect_FTP_to_get_file) # Выполняем загрузку данных с FTP
Отредактировано VIRTOK (Окт. 15, 2018 00:25:21)
Офлайн
0
осталось только научится по SSH подключатся SFTP а затем выполнять скачивание
Офлайн
857
VIRTOK по питону почитай книжку какую-нибудь. Ты не только программировать не умеешь, но и в питоне безграмотно пишешь. Нельзя так учиться программировать на питоне. В конечном итоге ты идёшь к правильному написанию (как пишут все развитые программисты), но методом тыка ты просто тратишь своё время, ты никак не догадаешься сам, как оно там должно быть написано. А в это время есть книги, в которых куча правильных кодов, стиль которых ты должен просто копировать на своём начальном уровне, чтобы выработать у себя такой же стиль. Там и правильные имена для функций, и правильные подходы, и правильные выборы модулей. В частности, считается очень плохим тоном делать по php-шному, складывать строки там и делать длиннющие строки. И узнать об этом можно только в книгах, потому что питон тебе не будет мешать писать всякую лажу. Но люди от тебя отвернутся и не будут тебе помогать, потому что твой код читать для них будет напряжно. Когда ты пишешь код, ты должен заботиться о людях, которые будут его читать. Это общее правило в программировании для любого языка.
Например, рассмотрим переменную Connect_FTP_to_get_file. Это имя сделано по-дебильному. То есть ты явно не знаешь, как имена делать. С больших букв называют классы, так принято уже лет двадцать. Чтобы это узнать, тебе нужно читать книги. Сам ты это никак не поймёшь, на этом имени не написано, что оно неправильно сделано.
А если ты код не умеешь писать, то алгоритм ты тем более построить не в состоянии. И вся помощь будет заключаться в полном написании программы за тебя. А кому это надо? Очень мало кому это надо.
Отредактировано py.user.next (Окт. 15, 2018 00:52:52)
Офлайн
0
py.user.nextСпасибо за наставления , у меня есть цель которую нужно достигнуть за 2 недели , решаю как могу
VIRTOK по питону почитай книжку какую-нибудь.
import paramiko import time host = '192.168.1.1' user = 'user' pass1 = 'test' pass2 = 'test' port = 22 #simple ssh connect sample client = paramiko.SSHClient() # хочу понять что тут за магия происходит client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname=host, username=user, password=pass1, port=port) stdin, stdout, stderr = client.exec_command('ls -l') data = stdout.read() + stderr.read() print (data) #terminal emulation shell = client.invoke_shell(term='vt100', width=80, height=24) # это зачем ? shell.sendall('su -c du \n') time.sleep(2) shell.sendall(pass2 + '\n') time.sleep(2) data = shell.recv(2048) print (data) client.close() #SFTP download file # тут более уже идет загрузка как я понял transport = paramiko.Transport((host, port)) transport.connect(username=user, password=pass1) sftp = paramiko.SFTPClient.from_transport(transport) # вот это основная строчка конекта SFTP , так ? remotepath = '/home/user/test.txt' localpath = 'C://python//test.txt' sftp.get(remotepath, localpath) sftp.close() transport.close()
Отредактировано VIRTOK (Окт. 15, 2018 09:37:01)
Офлайн