Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 12, 2018 17:35:39

VIRTOK
Зарегистрирован: 2017-10-23
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивное скачивание каталога и всего его содержимого с FTP

Цель :
-Рекурсивное скачивание каталога и всего его содержимого с 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)

Офлайн

#2 Окт. 12, 2018 17:37:51

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

Рекурсивное скачивание каталога и всего его содержимого с FTP

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



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

Офлайн

#3 Окт. 12, 2018 18:12:42

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Рекурсивное скачивание каталога и всего его содержимого с FTP

 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 сервера. А с теми, которые поддерживают, вы можете заметить различия между ними.

Офлайн

#4 Окт. 12, 2018 18:50:25

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Рекурсивное скачивание каталога и всего его содержимого с 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.

Офлайн

#5 Окт. 13, 2018 00:29:17

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

Рекурсивное скачивание каталога и всего его содержимого с FTP

VIRTOK
На данный момент получилось следующее , программа скачивает только один файл.
Нужно как минимум три функции: 1) функция чтения содержимого заданной директории на ftp-сервере; 2) функция скачивания заданного файла с ftp-сервера; 3) функция, управляющая первыми двумя функциями.

Это как раз тот случай, когда питон за тебя алгоритм строить не будет. Питон - это средство для реализации того алгоритма, который ты построил. Главное, что ты должен понять в сегодняшнее время (на том уровне развития, на котором ты сейчас находишься), - что питон не будет писать программу за тебя. Даже если бы ты его весь выучил, ты бы точно так же сидел бы и не знал, что писать. Программирование - это не выучивание языка. Это надо учиться строить алгоритмы, а для этого есть своя теория отдельная.

Я вижу эту программу в уже готовом виде в воображении. И вот она вообще не так выглядит. Это не одна функция. Там куча функций, где одна функция добывает имена из очередной директории, вторая функция берёт эти имена и решает, что с ними делать. Если это имя директории, то надо в неё дальше спускаться и всё повторять, а если это имя файла, то надо составить полный путь к нему и передать функции, которая скачивает файл по полному пути. Ещё логирование там. Это значит, что в промежутках между вызовами функций надо ещё через логирующую функцию записывать соотвествующие сообщения в лог.



Отредактировано py.user.next (Окт. 13, 2018 00:36:22)

Офлайн

#6 Окт. 15, 2018 00:22:29

VIRTOK
Зарегистрирован: 2017-10-23
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивное скачивание каталога и всего его содержимого с FTP

Задача решена частично

 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)

Офлайн

#7 Окт. 15, 2018 00:32:09

VIRTOK
Зарегистрирован: 2017-10-23
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивное скачивание каталога и всего его содержимого с FTP

осталось только научится по SSH подключатся SFTP а затем выполнять скачивание

Офлайн

#8 Окт. 15, 2018 00:44:22

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

Рекурсивное скачивание каталога и всего его содержимого с FTP

VIRTOK по питону почитай книжку какую-нибудь. Ты не только программировать не умеешь, но и в питоне безграмотно пишешь. Нельзя так учиться программировать на питоне. В конечном итоге ты идёшь к правильному написанию (как пишут все развитые программисты), но методом тыка ты просто тратишь своё время, ты никак не догадаешься сам, как оно там должно быть написано. А в это время есть книги, в которых куча правильных кодов, стиль которых ты должен просто копировать на своём начальном уровне, чтобы выработать у себя такой же стиль. Там и правильные имена для функций, и правильные подходы, и правильные выборы модулей. В частности, считается очень плохим тоном делать по php-шному, складывать строки там и делать длиннющие строки. И узнать об этом можно только в книгах, потому что питон тебе не будет мешать писать всякую лажу. Но люди от тебя отвернутся и не будут тебе помогать, потому что твой код читать для них будет напряжно. Когда ты пишешь код, ты должен заботиться о людях, которые будут его читать. Это общее правило в программировании для любого языка.

Например, рассмотрим переменную Connect_FTP_to_get_file. Это имя сделано по-дебильному. То есть ты явно не знаешь, как имена делать. С больших букв называют классы, так принято уже лет двадцать. Чтобы это узнать, тебе нужно читать книги. Сам ты это никак не поймёшь, на этом имени не написано, что оно неправильно сделано.

А если ты код не умеешь писать, то алгоритм ты тем более построить не в состоянии. И вся помощь будет заключаться в полном написании программы за тебя. А кому это надо? Очень мало кому это надо.



Отредактировано py.user.next (Окт. 15, 2018 00:52:52)

Офлайн

#9 Окт. 15, 2018 09:34:48

VIRTOK
Зарегистрирован: 2017-10-23
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивное скачивание каталога и всего его содержимого с FTP

py.user.next
VIRTOK по питону почитай книжку какую-нибудь.
Спасибо за наставления , у меня есть цель которую нужно достигнуть за 2 недели , решаю как могу
Нашел код

 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)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version