Скрипт Python Загрузка файлов через FTP

86

Я хотел бы сделать скрипт для загрузки файла на FTP.

Как будет работать система входа в систему? Я ищу что-то вроде этого:

ftp.login=(mylogin)
ftp.pass=(mypass)

И любые другие учетные данные.

Разочарованный Python Coder
источник

Ответы:

196

Используйте ftplib, можно написать так:

import ftplib
session = ftplib.FTP('server.address.com','USERNAME','PASSWORD')
file = open('kitten.jpg','rb')                  # file to send
session.storbinary('STOR kitten.jpg', file)     # send the file
file.close()                                    # close file and FTP
session.quit()

Используйте ftplib.FTP_TLSвместо этого, если FTP-хост требует TLS.


Чтобы получить его, вы можете использовать urllib.retrieve:

import urllib 

urllib.urlretrieve('ftp://server/path/to/file', 'file')

ИЗМЕНИТЬ :

Чтобы узнать текущий каталог, используйте FTP.pwd():

FTP.pwd (): возвращает путь к текущему каталогу на сервере.

Чтобы изменить каталог, используйте FTP.cwd(pathname):

FTP.cwd (путь): установите текущий каталог на сервере.

KZ
источник
1
@DawsonHensel You can use print ftp.pwd()покажет вам текущий путь, по которому вы находитесь.
KZ
есть какое-то странное поведение, я могу ftp к моему серверу из командной строки и загрузить файл, но не с ftplib, соединение просто открыто в течение некоторого времени, а затем выдается ошибка сокета. Что может быть причиной ?
89n3ur0n
Привет, я хочу знать, можно ли загрузить папку с помощью ftplib
вишрути
18

ftplib теперь поддерживает менеджеры контекста, поэтому я думаю, что это можно сделать еще проще

from ftplib import FTP
from pathlib import Path

file_path = Path('kitten.jpg')

with FTP('server.address.com', 'USER', 'PWD') as ftp, open(file_path, 'rb') as file:
        ftp.storbinary(f'STOR {file_path.name}', file)

Нет необходимости закрывать файл или сеанс

Gbonetti
источник
1
Если у кого-то возникают проблемы с загрузкой файла из Windows на FTP-сервер с использованием принятого ответа, этот метод сработал для меня.
mKane848
У меня была проблема с использованием этого для перезаписи / обновления двоичных файлов на удаленном FTP-сервере, но он хорошо работает с текстовыми файлами через ftp.storlines ...
Эдвард
5

Скорее всего, вы захотите использовать модуль ftplib для python

 import ftplib
 ftp = ftplib.FTP()
 host = "ftp.site.uk"
 port = 21
 ftp.connect(host, port)
 print (ftp.getwelcome())
 try:
      print ("Logging in...")
      ftp.login("yourusername", "yourpassword")
 except:
     "failed to login"

Это позволит вам войти на FTP-сервер. Что делать оттуда - решать вам. Ваш вопрос не указывает на какие-либо другие операции, которые действительно необходимо выполнить.

Tadgh
источник
Тэдж, спасибо. Главное, что у меня есть, - это сделать простую вещь, которая позволяет мне войти в систему и загружать необходимые файлы. Извините за такую ​​расплывчатость.
Разочарованный Python Coder
2
Это не ответ на вопрос
Хорхе Лейтао
4

Попробуй это:

#!/usr/bin/env python

import os
import paramiko 
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('hostname', username="username", password="password")
sftp = ssh.open_sftp()
localpath = '/home/e100075/python/ss.txt'
remotepath = '/home/developers/screenshots/ss.txt'
sftp.put(localpath, remotepath)
sftp.close()
ssh.close()
Ананд
источник
4
Вопрос в передаче файлов по FTP, а не по SFTP.
Сэм Хоссейни,
Согласен, SSHException: Error reading SSH protocol banner" when using ProxyCommandпри переходе по ftp по этому маршруту часто возникают ошибки.
Benloper
0

Я только что ответил на аналогичный вопрос здесь. ИМХО, если ваш FTP-сервер может общаться с Fabric, пожалуйста, используйте Fabric. Это намного лучше, чем сыроедение ftp.

У меня есть учетная запись FTP, dotgeek.comпоэтому я не уверен, будет ли она работать для других учетных записей FTP.

#!/usr/bin/python

from fabric.api import run, env, sudo, put

env.user = 'username'
env.hosts = ['ftp_host_name',]     # such as ftp.google.com

def copy():
    # assuming i have wong_8066.zip in the same directory as this script
    put('wong_8066.zip', '/www/public/wong_8066.zip')

сохраните файл как fabfile.pyи запустите fab copyлокально.

yeukhon@yeukhon-P5E-VM-DO:~$ fab copy2
[1.ai] Executing task 'copy2'
[1.ai] Login password: 
[1.ai] put: wong_8066.zip -> /www/public/wong_8066.zip

Done.
Disconnecting from 1.ai... done.

Еще раз, если вы не хотите постоянно вводить пароль, просто добавьте

env.password = 'my_password'
CppLearner
источник
1
Если я чего-то не упустил в документации по фабрикам, фабрика не поддерживает FTP. Вероятно, вам повезло, что dotgeek.com поддерживает как SSH, так и FTP, используя одни и те же учетные данные.
Epcylon
@Epcylon Fabric поддерживает SFTP - While the SFTP protocol (which put uses) ссылка
Alex L
2
@AlexL Верно, но SFTP никоим образом не то же самое, что FTP. Это два разных протокола для одной и той же цели, но если вам нужно подключиться к FTP-серверу, вы не можете использовать SFTP-клиент, и наоборот. Из википедии : «SFTP - это не FTP, работающий через SSH, а скорее новый протокол, разработанный с нуля рабочей группой IETF SECSH ».
Epcylon
@Epcylon Ага! Просто пытаюсь уточнить, что использует Fabric. Надеюсь, OP (или будущие читатели) могут использовать SFTP на своих серверах, а не использовать FTP, фабрика довольно удобна.
Alex L
0

Чтобы избежать ошибки шифрования, вы также можете попробовать следующие команды

ftp = ftplib.FTP_TLS("ftps.dummy.com")
ftp.login("username", "password")
ftp.prot_p()
file = open("filename", "rb")
ftp.storbinary("STOR filename", file)
file.close()
ftp.close()

ftp.prot_p () убедитесь, что ваши соединения зашифрованы

Шишир
источник
-1

Вы можете использовать функцию ниже. Я еще не тестировал, но все должно работать нормально. Помните, что место назначения - это путь к каталогу, а в качестве источника - полный путь к файлу.

import ftplib
import os

def uploadFileFTP(sourceFilePath, destinationDirectory, server, username, password):
    myFTP = ftplib.FTP(server, username, password)
    if destinationDirectory in [name for name, data in list(remote.mlsd())]:
        print "Destination Directory does not exist. Creating it first"
        myFTP.mkd(destinationDirectory)
    # Changing Working Directory
    myFTP.cwd(destinationDirectory)
    if os.path.isfile(sourceFilePath):
        fh = open(sourceFilePath, 'rb')
        myFTP.storbinary('STOR %s' % f, fh)
        fh.close()
    else:
        print "Source File does not exist"
Дебасиш Митра
источник
В myFTP.storbinary('STOR %s' % f, fh)чем есть % f?
Hrvoje T
@HrvojeT Не думайте, что% f требуется, поскольку он установлен по умолчанию. Подробнее см. Ftpguide.com/STRU.htm
Дебасиш Митра
Что удаленно?
sajid 08