Найти - Пользователи
Полная версия: Загрузить папку на FTP
Начало » Python для новичков » Загрузить папку на FTP
1
sdaert14
Добрый вечер.
Подскажите пожалуйста, как загрузить на 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 папку со всеми файлами и подпапками.
Я в питоне плохо разбираюсь, к сожалению.(
Заранее спасибо.
JOHN_16
Подобная задача типична, и обычно решается применением рекурсии
sdaert14
Вы не могли бы показать как именно? Я просто с питоном связался разово. Что смог за пару дней изучить, написал.
sdaert14
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()

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

Спасибо большое, но это не совсем то, что надо. Программа закидывает файлы на сервер, но как только натыкается на папку, переходит в нее и начинает закидывать ее.
Никак не пойму, что я делаю не так. Надо как-то возвращаться на уровень выше.
py.user.next
sdaert14
Никак не пойму, что я делаю не так.
Сначала сделай на локальном диске копирование дерева, а когда будет готово, подменишь место назначения и команды по созданию директорий и файлов на сетевые.
MasterElp
Добавь строки, при выходе из цикла:
 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('..')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB