Python-Skript Hochladen von Dateien über FTP


83

Ich möchte ein Skript erstellen, um eine Datei auf FTP hochzuladen.

Wie würde das Anmeldesystem funktionieren? Ich suche so etwas:

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

Und alle anderen Anmeldeinformationen.

Antworten:


190

Verwenden ftplibSie, Sie können es so schreiben:

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()

Verwenden Sie ftplib.FTP_TLSstattdessen, wenn Ihr FTP-Host TLS benötigt.


Um es abzurufen, können Sie Folgendes verwenden urllib.retrieve:

import urllib 

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

EDIT :

Um das aktuelle Verzeichnis herauszufinden, verwenden Sie FTP.pwd():

FTP.pwd (): Gibt den Pfadnamen des aktuellen Verzeichnisses auf dem Server zurück.

Verwenden Sie zum Ändern des Verzeichnisses FTP.cwd(pathname):

FTP.cwd (Pfadname): Legen Sie das aktuelle Verzeichnis auf dem Server fest.


@DawsonHensel Sie können verwenden print ftp.pwd(), um den aktuellen Pfad anzuzeigen , auf dem Sie sich befinden.
KZ

Es gibt ein seltsames Verhalten. Ich kann über die Befehlszeile und die Upload-Datei auf meinen Server ftp, aber nicht mit ftplib. Die Verbindung ist nur für einige Zeit geöffnet und dann wird ein Socket-Fehler ausgelöst. Was könnte der Grund sein?
89n3ur0n

16

ftplib unterstützt jetzt Kontextmanager, sodass ich denke, dass dies noch einfacher gemacht werden kann

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)

Sie müssen die Datei oder die Sitzung nicht schließen


1
Wenn jemand Probleme beim Hochladen einer Datei von Windows auf einen FTP-Server mit der akzeptierten Antwort hat, hat diese Methode bei mir funktioniert.
mKane848

5

Sie werden höchstwahrscheinlich das ftplib-Modul für Python verwenden wollen

 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"

Dadurch werden Sie bei einem FTP-Server angemeldet. Was Sie von dort aus tun, liegt bei Ihnen. Ihre Frage zeigt keine anderen Operationen an, die wirklich ausgeführt werden müssen.


Tadgh, danke. Das Hauptanliegen, das ich habe, ist es, eine einfache Sache zu machen, die mich anmeldet und mir ermöglicht, die erforderlichen Dateien hochzuladen. Tut mir leid, dass ich so vage bin.
Frustrierter Python Coder

2
Dies beantwortet nicht die Frage
Jorge Leitao

4

Versuche dies:

#!/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
Bei der Frage geht es um die Übertragung von Dateien über FTP, nicht über SFTP.
Sam Hosseini

Einverstanden, häufig SSHException: Error reading SSH protocol banner" when using ProxyCommandFehler erhalten, wenn Sie diese Route auf FTP gehen.
Benloper

0

Ich habe gerade eine ähnliche Frage hier beantwortet , IMHO, wenn Ihr FTP-Server in der Lage ist, mit Fabric zu kommunizieren, bitte uns Fabric. Es ist weitaus besser als roh zu machen ftp.

Ich habe ein FTP-Konto von, dotgeek.comdaher bin ich mir nicht sicher, ob dies für andere FTP-Konten funktioniert.

#!/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')

Speichern Sie die Datei als fabfile.pyund führen Sie sie fab copylokal aus.

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.

Wenn Sie nicht immer ein Passwort eingeben möchten, fügen Sie einfach hinzu

env.password = 'my_password'

1
Sofern in der Stoffdokumentation nichts fehlt, unterstützt Stoff kein FTP. Sie haben wahrscheinlich den glücklichen Umstand, dass dotgeek.com sowohl SSH als auch FTP mit denselben Anmeldeinformationen unterstützt.
Epcylon

@ Epcylon Fabric unterstützt SFTP - While the SFTP protocol (which put uses) Link
Alex L

2
@AlexL Richtig, aber SFTP ist in keiner Weise dasselbe wie FTP. Es handelt sich um zwei verschiedene Protokolle für denselben Zweck. Wenn Sie jedoch eine Verbindung zu einem FTP-Server herstellen müssen, können Sie keinen SFTP-Client verwenden und umgekehrt. Aus Wikipedia : "SFTP wird nicht über SSH ausgeführt, sondern über a neues Protokoll, das von der IETF SECSH-Arbeitsgruppe von Grund auf neu entwickelt wurde. "
Epcylon

@ Epcylon Yup! Ich versuche nur zu klären, was Fabric verwendet. Hoffentlich kann das OP (oder zukünftige Leser) SFTP auf ihre Server übertragen, anstatt FTP zu verwenden. Fabric ist ziemlich praktisch.
Alex L

0

Um den Verschlüsselungsfehler zu vermeiden, können Sie auch die folgenden Befehle ausprobieren

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 () stellt sicher, dass Ihre Verbindungen verschlüsselt sind


-1

Sie können die folgende Funktion verwenden. Ich habe es noch nicht getestet, aber es sollte gut funktionieren. Denken Sie daran, dass das Ziel ein Verzeichnispfad ist, dessen Quellpfad als Quelle vollständig ist.

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"

In myFTP.storbinary('STOR %s' % f, fh)was ist % f?
Hrvoje T

@HrvojeT Denken Sie nicht, dass% f erforderlich ist, da es als Standard festgelegt ist. Für Details siehe diese ftpguide.com/STRU.htm
Debasish Mitra

Was ist fern?
Sajid
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.