Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 3, 2015 15:17:43

sdaert14
Зарегистрирован: 2015-10-03
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузить папку на FTP

Добрый вечер.
Подскажите пожалуйста, как загрузить на FTP-сервер при помощи ftplib папку с файлами?
С загрузкой отдельных файлов трудностей нет.
Но как записать на ftp папку с вложенными подпапками? (проблема с подпапками, если делать циклом)
Если будет пример кода, буду очень благодарен.
Я с питоном мало знаком.

from ftplib import *
import os
 
def sendfolder(folder):
    print os.getcwd()
    filelist = os.listdir(folder)
    print os.listdir(folder)
 
    for filename in filelist:
        if os.path.isdir(filename):
            ftp.mkd(filename)
            ftp.cwd(filename)
            os.chdir(folder + "\\" + filename)
            sendfolder(folder + "\\" + filename)
 
        elif os.path.isfile(filename):      
            file = open(filename,'r')
            ftp.storbinary('STOR ' + filename, file)
            file.close()
            print "Uploaded " + filename    
 
        else:           
            os.chdir("..")
            ftp.cwd("..")
 
#queryes
ip = raw_input("Please enter IP: ")
                            
#FTP sending
print "Connecting to FTP-server..."
ftp = FTP(ip)
ftp.login("admin","admin")
print ftp.getwelcome()
print ftp.pwd()
print ftp.dir()
dir = os.getcwd()
sendfolder(dir)
ftp.quit()
ftp.close() 

вот пример моего быдлокода. получается добраться до самых “глубоких” по вложенности файлов. Но как вернуться на уровень выше? Помогите, кто знает, как усовершенствовать код.
Нужно загрузить на ftp папку со всеми файлами и подпапками.
Я в питоне плохо разбираюсь, к сожалению.(
Заранее спасибо.

Офлайн

#2 Окт. 3, 2015 17:25:26

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

Загрузить папку на FTP

Подобная задача типична, и обычно решается применением рекурсии



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

Офлайн

#3 Окт. 3, 2015 20:25:12

sdaert14
Зарегистрирован: 2015-10-03
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузить папку на FTP

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

Офлайн

#4 Окт. 3, 2015 22:00:36

sdaert14
Зарегистрирован: 2015-10-03
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузить папку на FTP

from ftplib import *
import os
import time
def sendfolder(folder):
	listforsend = []
	for file in os.listdir(folder):
		path = os.path.join(folder, file)
		if not os.path.isdir(path):
			sendfile = open(path,'r')
			ftp.storbinary('STOR ' + file, sendfile)
			sendfile.close()
			time.sleep(0.1)
			print "Uploaded " + file
		else:
			print "Directory finded " + path
			ftp.mkd(file)
			ftp.cwd(file)
			sendfolder(path)
	
ftp = FTP('localhost')
ftp.login('anonymous','aa@')
ftp.cwd('ftp')
ftp.dir()
directory = os.getcwd()
sendfolder(directory)
ftp.quit()
ftp.close()

Попробовал проще. Так тоже криво

Офлайн

#5 Окт. 4, 2015 00:22:36

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

Загрузить папку на FTP

Вообще то это и есть рекурсия - вызов в функции самой себя. :) Для первого раза у вас оч. хорошо получилось.



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

Офлайн

#6 Окт. 4, 2015 09:37:36

sdaert14
Зарегистрирован: 2015-10-03
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузить папку на FTP

JOHN_16
Вообще то это и есть рекурсия - вызов в функции самой себя. Для первого раза у вас оч. хорошо получилось.

Спасибо большое, но это не совсем то, что надо. Программа закидывает файлы на сервер, но как только натыкается на папку, переходит в нее и начинает закидывать ее.
Никак не пойму, что я делаю не так. Надо как-то возвращаться на уровень выше.

Офлайн

#7 Окт. 5, 2015 02:18:56

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

Загрузить папку на FTP

sdaert14
Никак не пойму, что я делаю не так.
Сначала сделай на локальном диске копирование дерева, а когда будет готово, подменишь место назначения и команды по созданию директорий и файлов на сетевые.



Офлайн

#8 Авг. 2, 2019 09:16:58

MasterElp
Зарегистрирован: 2019-08-02
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Загрузить папку на FTP

Добавь строки, при выходе из цикла:

 ftp.cwd('..')
os.chdir('..')
Вот мой пример:
 def upload_dir_recursion(ftp, sended_dir_path):
    os.chdir(sended_dir_path)
    for file_name in os.listdir(sended_dir_path):
    	file_path_name = os.path.join(sended_dir_path, file_name)
        if os.path.isfile(file_path_name):
            file = open(file_path_name, 'rb')
            ftp.storbinary('STOR {}'.format(file_name), file)
            file.close()
            print "Uploaded: " + file_path_name
        elif os.path.isdir(file_path_name):
        	print "Directory finded: " + file_path_name
        	ftp.mkd(file_name)
        	ftp.cwd(file_name)
        	upload_dir_recursion(ftp, file_path_name)
    ftp.cwd('..')
    os.chdir('..')

Отредактировано MasterElp (Авг. 2, 2019 09:40:06)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version