Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 20 Netzwerkkommunikation
  Pfeil 20.1 Socket API
    Pfeil 20.1.1 Client/Server-Systeme
    Pfeil 20.1.2 UDP
    Pfeil 20.1.3 TCP
    Pfeil 20.1.4 Blockierende und nicht-blockierende Sockets
    Pfeil 20.1.5 Verwendung des Moduls
    Pfeil 20.1.6 Netzwerk-Byte-Order
    Pfeil 20.1.7 Multiplexende Server – select
    Pfeil 20.1.8 SocketServer
  Pfeil 20.2 Zugriff auf Ressourcen im Internet – urllib
    Pfeil 20.2.1 Verwendung des Moduls
  Pfeil 20.3 Einlesen einer URL – urlparse
  Pfeil 20.4 FTP – ftplib
  Pfeil 20.5 E-Mail
    Pfeil 20.5.1 SMTP – smtplib
    Pfeil 20.5.2 POP3 – poplib
    Pfeil 20.5.3 IMAP4 – imaplib
    Pfeil 20.5.4 Erstellen komplexer E-Mails – email
  Pfeil 20.6 Telnet – telnetlib
  Pfeil 20.7 XML-RPC
    Pfeil 20.7.1 Der Server
    Pfeil 20.7.2 Der Client
    Pfeil 20.7.3 Multicall
    Pfeil 20.7.4 Einschränkungen


Galileo Computing - Zum Seitenanfang

20.4 FTP – ftplib  topZur vorigen Überschrift

Das Modul ftplib ermöglicht es einer Anwendung, sich mit einem FTP-Server zu verbinden und Operationen auf diesem durchzuführen. FTP steht für File Transfer Protocol und bezeichnet ein Netzwerkprotokoll, das für Dateiübertragungen in TCP/IP-Netzwerken entwickelt wurde. Gerade im Internet ist FTP sehr verbreitet. So geschehen beispielsweise Dateiübertragungen auf einen Webserver üblicherweise via FTP.

Das Protokoll FTP ist sehr einfach aufgebaut und besteht aus einer umfangreichen Anzahl von Befehlen, die auch von Menschen gelesen werden können. Im Prinzip könnte man also auch direkt mit dem FTP-Server kommunizieren, ohne eine abstrahierende Bibliothek zwischenzuschalten. Die folgende Tabelle listet die wichtigsten FTP-Befehle auf und erläutert kurz ihre Bedeutung. Sie werden sehen, dass sich das Modul ftplib sehr stark an diese Befehle anlehnt und man deshalb gut beraten ist, sich zumindest einen Überblick über die FTP-Befehle zu verschaffen.


Tabelle 20.5  FTP-Befehle
Befehl Beschreibung
OPEN

Baut eine Verbindung zu einem FTP-Server auf.

USER

Überträgt einen Benutzernamen zum Login an den FTP-Server.

PASS

Überträgt ein Passwort zum Login an den FTP-Server.

CWD

Ändert das aktuelle Arbeitsverzeichnis auf dem FTP-Server. (CWD steht für »change working directory«.)

PWD

Gibt das aktuelle Arbeitsverzeichnis auf dem FTP-Server zurück. (PWD steht für »print working directory«.)

DELE

Löscht eine Datei auf dem FTP-Server. (DELE steht für »delete«.)

LIST LS

Überträgt eine Liste aller im Arbeitsverzeichnis enthaltenen Dateien und Ordner. Die Liste wird über den Datenkanal übermittelt.

MKD

Erstellt ein Verzeichnis auf dem FTP-Server. (MKD steht für »make directory«.)

RMD

Löscht ein Verzeichnis auf dem FTP-Server. (RMD steht für »remove directory«.)

RETR

Überträgt eine Datei vom FTP-Server. (RETR steht für »retrieve«.)

STOR

Überträgt eine Datei vom Client an den FTP-Server. (STOR steht für »store«.)

QUIT

Beendet die Verbindung zwischen Server und Client.


Die Kommunikation mit einem FTP-Server läuft auf zwei Kanälen ab: auf dem Steuerkanal zum Senden von Befehlen an den Server und auf dem Datenkanal zum Empfangen von Daten. Diese Trennung von Kommando- und Übertragungsebene ermöglicht es, dass auch während einer laufenden Datenübertragung Befehle, beispielsweise zum Abbruch der Übertragung, an den Server gesendet werden können. Grundsätzlich kann eine Datenübertragung in zwei Modi ablaufen. Im sogenannten aktiven Modus fordert der Client eine Datei an und öffnet gleichzeitig einen Port, über den dann die Übertragung der Datei ablaufen soll. Dem gegenüber steht der passive Modus, bei dem der Client den Server instruiert, einen Port zu öffnen, um die Datenübertragung durchzuführen. Das hat den Vorteil, dass auch Datenübertragungen mit Clients stattfinden können, die für den Server nicht direkt adressierbar sind, weil sie beispielsweise hinter einem Router oder einer Firewall stehen.

So viel zu den theoretischen Grundlagen. Ab jetzt werden wir behandeln, wie das Modul ftplib zur Kommunikation mit einem FTP-Server verwendet werden kann. Das Modul ftplib stellt die Klasse FTP zur Verfügung, die es einer Anwendung ermöglicht, sich mit einem FTP-Server zu verbinden und die dort unterstützten Operationen auszuführen. Mit diesem Modul kann man also einen vollwertigen FTP-Client implementieren.

Bereits beim Instanziieren der Klasse FTP kann eine Verbindung mit einem FTP-Server hergestellt werden. Dazu muss dem Konstruktor mindestens die Adresse des FTP-Servers als String übergeben werden. Der Konstruktor der Klasse FTP hat folgende Schnittstelle:

FTP([host[, user[, passwd[, acct]]]])

Der Konstruktor erzeugt eine Instanz der Klasse FTP, die mit dem FTP-Server host verbunden ist. Bei der Anmeldung an diesem Server werden der Benutzername user, das Passwort passwd und, sofern notwendig, der Account acct verwendet.

Die Klasse FTP

Im Folgenden sollen die wichtigsten Methoden einer FTP-Instanz erläutert werden. Um die folgenden Beispiele ausführen zu können, müssen Sie sowohl das Modul ftplib importieren als auch eine FTP-Instanz ftp erzeugen, die mit einem FTP-Server Ihrer Wahl verbunden ist:

>>> import ftplib 
>>> ftp = ftplib.FTP("ftp://ftp.test.de")

Im Folgenden sei f eine Instanz der Klasse ftplib.FTP.

f.connect(host[, port])

Verbindet zu dem FTP-Server host unter Verwendung des Ports port. Diese Methode sollte nicht aufgerufen werden, wenn bei der Instanziierung der Klasse FTP bereits die Adresse des FTP-Servers übergeben wurde.

f.getwelcome()

Gibt die Willkommensnachricht des verbundenen FTP-Servers als String zurück.

>>> ftp.getwelcome() 
'220 Welcome to xyz FTP server. Please login...'
f.login([user[, passwd[, acct]]])

Loggt sich auf dem verbundenen FTP-Server ein. Beachten Sie, dass die Methode connect unbedingt aufgerufen werden muss, bevor ein Login durchgeführt werden kann.

Die Parameter haben dieselbe Bedeutung wie die des Konstruktors der Klasse FTP.

>>> ftp.login("Benutzername", "Passwort") 
'230 User Benutzername logged in'

Wenn die Methode login aufgerufen wird, obwohl der Client bereits eingeloggt ist, wird eine ftplib.error_perm-Exception geworfen.

f.abort()

Unterbricht einen laufenden Dateitransfer. Beachten Sie, dass eine solche Unterbrechung je nach Server nicht zu jedem Zeitpunkt durchgeführt werden kann.

f.sendcmd(command)

Schickt den Kommandostring command an den verbundenen FTP-Server und gibt dessen Antwort ebenfalls als String zurück.

>>> ftp.sendcmd("PWD") 
'257 "/" is the current directory'
f.retrbinary(command, callback[, maxblocksize])

Leitet einen Datentransfer im Binärmodus ein. Dazu muss als erster Parameter ein entsprechendes FTP-Kommando übergeben werden, aufgrund dessen der Server einen Datentransfer über den Datenkanal startet. Für einen simplen Dateitransfer dient das Kommando »RETR dateiname«.

An zweiter Stelle muss ein Funktionsobjekt übergeben werden. Die dahinter stehende Funktion muss exakt einen Parameter akzeptieren. Nach jedem erfolgreich übermittelten Block wird die Funktion callback aufgerufen. Die übertragenen Binärdaten werden dabei als Parameter in Form eines Strings übergeben.

Über den Parameter maxblocksize kann die maximale Größe der Blöcke angegeben werden, in die die Datei zum Herunterladen aufgeteilt wird.

bild = "" 
def f(data): 
    global bild 
    bild += data 
ftp.retrbinary("RETR bild.jpg", f)

Das Beispielprogramm lädt die Bilddatei bild.jpg aus dem aktuellen Arbeitsverzeichnis des FTP-Servers herunter und speichert die Binärdaten im String bild.

Alternativ könnte auch ein LIST-Kommando abgesetzt werden, aufgrund dessen der Verzeichnisinhalt ebenfalls über den Datenkanal geschickt wird:

>>> def f(data): 
...     print data 
... 
>>> ftp.retrbinary("LIST", f) 
drwxr-xr-x  11 user   group       360 Sep  5 02:45 . 
drwxr-xr-x  11 user   group       360 Sep  5 02:45 .. 
drwxr-xr-x   4 user   group        96 Jun 20  2006 ordner1 
[…]
f.retrlines(command[, callback])

Leitet einen Dateitransfer im ASCII-Modus ein. Dazu muss als erster Parameter ein entsprechendes FTP-Kommando übergeben werden. Für einen simplen Dateitransfer wäre dies »RETR dateiname«. Möglich wäre aber beispielsweise auch, den Inhalt des Arbeitsverzeichnisses durch ein LIST-Kommando zu übertragen.

Eine Dateiübertragung im ASCII-Modus geschieht zeilenweise. Das heißt, die Callback-Funktion callback wird nach jeder vollständig übertragenen Zeile aufgerufen. Sie bekommt dabei die gelesene Zeile als Parameter übergeben. Beachten Sie, dass das abschließende Newline-Zeichen nicht mit übergeben wird.

Wenn keine Callback-Funktion angegeben wurde, werden die übertragenen Daten ausgegeben.

text = "" 
def f(data): 
    global text 
    text = "".join((text, data, "\n")) 
ftp.retrlines("RETR text.txt", f)

Dieses Beispielprogramm lädt die Textdatei text.txt zeilenweise herunter und fügt die heruntergeladenen Zeilen im String text wieder zu einem Gesamttext zusammen.

f.set_pasv(boolean)

Wenn für boolean False übergeben wird, wird die FTP-Instanz in den sogenannten aktiven Zustand versetzt. Ein Wert von True versetzt sie zurück in den passiven Zustand. Beachten Sie, dass der Client im aktiven Zustand für den Server erreichbar sein muss, sich also nicht hinter einer Firewall oder einem Router befinden darf.

f.storbinary(command, file[, blocksize])

Leitet einen Datei-Upload ein. Dabei muss als erster Parameter ein entsprechender FTP-Befehl übergeben werden. Für einen simplen Datei-Upload lautet dieser Befehl »STOR datei«, wobei datei der Zielname der Datei auf dem FTP-Server ist. Als zweiter Parameter muss ein geöffnetes Dateiobjekt übergeben werden, dessen Inhalt hochgeladen werden soll.

Optional kann in Form des dritten Parameters, blocksize, die maximale Größe der Datenblöcke angegeben werden, in denen die Datei hochgeladen wird.

Das folgende Beispielprogramm führt einen binären Datei-Upload durch:

f = open("bla.txt", "r") 
ftp.storbinary("STOR hallo.txt", f) 
f.close()

Beachten Sie, dass die Datei im lokalen Arbeitsverzeichnis bla.txt heißt, auf den Server jedoch unter dem Namen hallo.txt hochgeladen wird.

f.storlines(command, file)

Verhält sich ähnlich wie storbinary mit dem Unterschied, dass die Datei im ASCII-Modus zeilenweise hochgeladen wird. Die Parameter command und file können wie bei storbinary verwendet werden.

f.nlst([dirname])

Gibt eine Liste mit dem Inhalt des aktuellen Arbeitsverzeichnisses auf dem FTP-Server zurück. Über den optionalen Parameter dirname kann ein Unterverzeichnis angegeben werden, dessen Inhalt aufgelistet werden soll:

>>> ftp.nlst() 
['.', '..', 'ordner1', 'ordner2', 'hallo.txt'] 
>>> ftp.nlst("ordner1") 
[' ordner1/.', ' ordner1/..', ' ordner1/test.py']

Neben den im Arbeitsverzeichnis existierenden Ordnern und Dateien sind die Verweise auf das aktuelle Verzeichnis (.) und das übergeordnete Verzeichnis (..) in der Liste enthalten.

f.dir([dirname[, callback]])

Gibt den Inhalt des aktuellen Arbeitsverzeichnisses auf dem FTP-Server in Form einer Aufzählung auf dem Bildschirm aus, wie sie vom FTP-Befehl LIST erzeugt würde. Optional kann über den Parameter dirname ein Unterverzeichnis angegeben werden, dessen Inhalt ausgegeben werden soll.

Außerdem kann eine Callback-Funktion übergeben werden, die anstelle einer Bildschirmausgabe aufgerufen wird. Die Callback-Funktion callback muss über die gleiche Schnittstelle verfügen wie die, die bei retrlines angegeben werden kann.

>>> ftp.dir() 
drwxr-xr-x  11 user   group       360 Sep  5 02:45 . 
drwxr-xr-x  11 user   group       360 Sep  5 02:45 .. 
[…]
f.rename(fromname, toname)

Benennt die Datei fromname auf dem FTP-Server nach toname um.

>>> ftp.rename("ordner", "ordner2") 
'250 Rename successful'

Es erübrigt sich zu sagen, dass der Ordner, der umbenannt werden soll, existieren muss. Ist dies nicht der Fall, wird eine ftplib.error_perm-Exception geworfen.

f.delete(filename)

Löscht die Datei filename auf dem FTP-Server.

>>> ftp.delete("hallo.txt") 
'250 DELE command successful'

Auch hier wird eine ftplib.error_perm-Exception geworfen, wenn die zu löschende Datei nicht existiert.

f.cwd(pathname)

Ändert das aktuelle Arbeitsverzeichnis auf dem FTP-Server in pathname. Sollte das Verzeichnis pathname nicht existieren, wird eine ftplib.error_perm-Exception geworfen.

>>> ftp.cwd("ordner") 
'250 CWD command successful'
f.mkd(pathname)

Erzeugt das Verzeichnis pathname auf dem FTP-Server. Die Methode mkd gibt den Pfad zu dem neu erstellten Verzeichnis zurück.

>>> ftp.mkd("ordner") 
'/ordner'

Beachten Sie, dass kein Verzeichnis dieses Namens bereits existieren darf. In einem solchen Fall würde eine ftplib.error_perm-Exception geworfen.

f.pwd()

Gibt den Pfad des aktuellen Arbeitsverzeichnisses auf dem FTP-Server zurück.

>>> ftp.pwd() 
'/'
f.rmd(dirname)

Löscht das Verzeichnis dirname auf dem FTP-Server. Beachten Sie, dass das Verzeichnis dirname vorhanden und leer sein muss, damit es erfolgreich gelöscht werden kann. Im Fehlerfall wird eine ftplib.error_perm-Exception geworfen.

>>> ftp.rmd("ordner") 
'250 RMD command successful'
f.size(filename)

Ermittelt die Dateigröße der Datei filename auf dem FTP-Server. Wenn sie sich ermitteln ließ, wird die Dateigröße als ganze Zahl zurückgegeben, andernfalls ist der Rückgabewert None. Beachten Sie, dass das dieser Methode zugrunde liegende FTP-Kommando SIZE nicht standardisiert ist und somit nicht von allen FTP-Servern unterstützt wird.

f.quit()

Beendet die Verbindung zum FTP-Server, indem ihm ein QUIT-Befehl gesendet wird. Dies ist die saubere Art, die Verbindung zu kappen, könnte aber eine Exception verursachen, wenn der Server mit einem Fehlercode antworten sollte.

Der Aufruf von quit erübrigt einen weiteren Aufruf von close.

f.close()

Beendet die Verbindung, ohne den FTP-Server darüber in Kenntnis zu setzen. Beachten Sie, dass dieselbe FTP-Instanz nach Aufruf dieser Funktion nicht wieder per login mit einem FTP-Server verbunden werden kann. Dazu sollte eine neue Instanz erzeugt werden.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python






Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Linux






 Linux


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Praxisbuch Web 2.0






 Praxisbuch Web 2.0


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Praxisbuch Objektorientierung






 Praxisbuch Objektorientierung


Zum Katalog: Einstieg in SQL






 Einstieg in SQL


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de