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.