Python Script Завантаження файлів через FTP


86

Я хотів би створити сценарій для завантаження файлу на FTP.

Як би працювала система входу? Я шукаю щось подібне:

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

І будь-який інший вхід в облікові дані.

Відповіді:


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 (ім'я шляху): встановіть поточний каталог на сервері.


1
@DawsonHensel You can use print ftp.pwd()покаже вам поточний шлях, на якому ви перебуваєте.
— KZ

є якась дивна поведінка, я можу ftp на свій сервер із командного рядка та завантажувати файл, але не за допомогою ftplib, підключення просто відкрито деякий час, а потім видається помилка сокета. що може бути причиною?
— 89n3ur0n

Привіт, я хочу знати, чи можливо завантажити папку за допомогою ftplib
— vishruti

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)

Не потрібно закривати файл або сеанс


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

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

Я щойно відповів на подібне запитання тут IMHO, якщо ваш 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'

1
Якщо я щось не пропускаю в документації щодо тканин, тканина не підтримує FTP. Напевно, вам пощастило, що dotgeek.com підтримує як SSH, так і FTP, використовуючи однакові облікові дані.
— Епцилон

@Epcylon Fabric підтримує SFTP - While the SFTP protocol (which put uses) посилання
— Alex L

2
@AlexL Правильно, але SFTP нічим не відрізняється від FTP. Це два різні протоколи для однієї мети, але якщо вам потрібно підключитися до FTP-сервера, ви не можете використовувати SFTP-клієнт, і навпаки. З wikipedia : "SFTP - це не FTP, що працює над SSH, а швидше новий протокол, розроблений з нуля робочою групою IETF SECSH ".
— Епцилон,

@Epcylon Yup! Просто намагаюся пояснити, що використовує 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
— Debasish Mitra

Що таке дистанційне?
— sajid
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.