Rheinwerk Computing < openbook >

 
Inhaltsverzeichnis
1 Einleitung
2 Die Programmiersprache Python
Teil I Einstieg in Python
3 Erste Schritte im interaktiven Modus
4 Der Weg zum ersten Programm
5 Kontrollstrukturen
6 Dateien
7 Das Laufzeitmodell
8 Funktionen, Methoden und Attribute
9 Informationsquellen zu Python
Teil II Datentypen
10 Das Nichts – NoneType
11 Operatoren
12 Numerische Datentypen
13 Sequenzielle Datentypen
14 Zuordnungen
15 Mengen
16 Collections
17 Datum und Zeit
18 Aufzählungstypen – Enum
Teil III Fortgeschrittene Programmiertechniken
19 Funktionen
20 Modularisierung
21 Objektorientierung
22 Ausnahmebehandlung
23 Iteratoren
24 Kontextobjekte
25 Manipulation von Funktionen und Methoden
Teil IV Die Standardbibliothek
26 Mathematik
27 Kryptografie
28 Reguläre Ausdrücke
29 Schnittstelle zu Betriebssystem und Laufzeitumgebung
30 Kommandozeilenparameter
31 Dateisystem
32 Parallele Programmierung
33 Datenspeicherung
34 Netzwerkkommunikation
35 Debugging und Qualitätssicherung
36 Dokumentation
Teil V Weiterführende Themen
37 Anbindung an andere Programmiersprachen
38 Distribution von Python-Projekten
39 Grafische Benutzeroberflächen
40 Python als serverseitige Programmiersprache im WWW – ein Einstieg in Django
41 Wissenschaftliches Rechnen
42 Insiderwissen
43 Von Python 2 nach Python 3
A Anhang
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 464 KB

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Python 3 von Johannes Ernesti, Peter Kaiser
Das umfassende Handbuch
Buch: Python 3

Python 3
Pfeil 34 Netzwerkkommunikation
Pfeil 34.1 Socket API
Pfeil 34.1.1 Client-Server-Systeme
Pfeil 34.1.2 UDP
Pfeil 34.1.3 TCP
Pfeil 34.1.4 Blockierende und nicht-blockierende Sockets
Pfeil 34.1.5 Erzeugen eines Sockets
Pfeil 34.1.6 Die Socket-Klasse
Pfeil 34.1.7 Netzwerk-Byte-Order
Pfeil 34.1.8 Multiplexende Server – selectors
Pfeil 34.1.9 Objektorientierte Serverentwicklung – socketserver
Pfeil 34.2 URLs – urllib
Pfeil 34.2.1 Zugriff auf entfernte Ressourcen – urllib.request
Pfeil 34.2.2 Einlesen und Verarbeiten von URLs – urllib.parse
Pfeil 34.3 FTP – ftplib
Pfeil 34.3.1 Mit einem FTP-Server verbinden
Pfeil 34.3.2 FTP-Kommandos ausführen
Pfeil 34.3.3 Mit Dateien und Verzeichnissen arbeiten
Pfeil 34.3.4 Übertragen von Dateien
Pfeil 34.4 E‐Mail
Pfeil 34.4.1 SMTP – smtplib
Pfeil 34.4.2 POP3 – poplib
Pfeil 34.4.3 IMAP4 – imaplib
Pfeil 34.4.4 Erstellen komplexer E‐Mails – email
Pfeil 34.5 Telnet – telnetlib
Pfeil 34.5.1 Die Klasse Telnet
Pfeil 34.5.2 Beispiel
Pfeil 34.6 XML-RPC
Pfeil 34.6.1 Der Server
Pfeil 34.6.2 Der Client
Pfeil 34.6.3 Multicall
Pfeil 34.6.4 Einschränkungen
 
Zum Seitenanfang

34.3    FTP – ftplib Zur vorigen ÜberschriftZur nächsten Überschrift

Das Modul ftplib ermöglicht 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 verbreitet. So erfolgen beispielsweise Dateiübertragungen auf einen Webserver üblicherweise via FTP.

Das Protokoll FTP ist sehr einfach aufgebaut und besteht aus einer Reihe 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. Tabelle 34.7 listet die wichtigsten FTP-Befehle auf und erläutert kurz ihre Bedeutung. Sie werden sehen, dass sich das Modul ftplib stark an diese Befehle anlehnt.

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 für change working directory).
PWD Gibt das aktuelle Arbeitsverzeichnis auf dem FTP-Server zurück (PWD für print working directory).
DELE Löscht eine Datei auf dem FTP-Server (DELE für delete).
LIST
LS
Überträgt eine Liste aller im Arbeitsverzeichnis enthaltenen Dateien und Ordner.
MKD Erstellt ein Verzeichnis auf dem FTP-Server (MKD für make directory).
RMD Löscht ein Verzeichnis auf dem FTP-Server (RMD für remove directory).
RETR Überträgt eine Datei vom FTP-Server (RETR für retrieve).
STOR Überträgt eine Datei vom Client an den FTP-Server (STOR für store).
QUIT Beendet die Verbindung zwischen Server und Client.

Tabelle 34.7    FTP-Befehle

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 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.

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 können Sie also einen vollwertigen FTP-Client implementieren.

 
Zum Seitenanfang

34.3.1    Mit einem FTP-Server verbinden Zur vorigen ÜberschriftZur nächsten Überschrift

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 die im Folgenden beschriebene Schnittstelle:

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

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 und das Passwort passwd verwendet. Über den optionalen Parameter timeout wird ein Timeout-Wert in Sekunden für die Verbindungsanfrage eingestellt. Wenn Sie timeout nicht angeben, wird ein System-Default verwendet.

Über den Parameter acct (für accounting information) können weitere Informationen an den FTP-Server gesendet werden, was aber in der Regel nicht benötigt wird. Mit source_address wird die Herkunftsadresse, die bei der Verbindung verwendet werden soll, als Tupel im Format (ip, port) angegeben.

Alternativ lässt sich die FTP-Klasse parameterlos instanziieren. Dann wird die Verbindung über die Methoden connect und login hergestellt, denen jeweils die Verbindungs- bzw. Login-Daten übergeben werden müssen:

>>> import ftplib
>>> ftp = ftplib.FTP()
>>> ftp.connect("ftp.server.de")
'220 Serverantwort'
>>> ftp.login("Benutzername", "Passwort")
'230 Login successful.'

Die Methode connect unterstützt zusätzlich die optionalen Parameter port und timeout.

Die Verbindung zu einem FTP-Server kann über die parameterlosen Methoden quit und close beendet werden. Dabei trennt quit die Verbindung sauber, indem es ein QUIT-Kommando an den Server sendet und dessen Antwort abwartet, während close die Verbindung trennt, ohne den Server davon in Kenntnis zu setzen.

Um die Beispiele in den folgenden Abschnitten 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.server.de")
>>> ftp.login("Benutzername", "Passwort")
'230 Login successful.'
[»]  Hinweis

Die FTP-Klasse lässt sich mit dem with-Statement verwenden:

with ftplib.FTP("ftp.server.de") as f:
f.login("Benutzername", "Passwort")
 
Zum Seitenanfang

34.3.2    FTP-Kommandos ausführen Zur vorigen ÜberschriftZur nächsten Überschrift

Die Klasse FTP definiert, wie Sie in den folgenden Abschnitten sehen werden, Methoden für die gängigsten FTP-Kommandos. Um darüber hinaus direkt mit dem FTP-Server zu kommunizieren, existiert die Methode sendcmd, die ein Kommando als String an den Server sendet und die Antwort des Servers ebenfalls als String zurückgibt.

>>> ftp.sendcmd("PWD")
'257 "/" is the current directory.'
 
Zum Seitenanfang

34.3.3    Mit Dateien und Verzeichnissen arbeiten Zur vorigen ÜberschriftZur nächsten Überschrift

Analog zu den eingangs besprochenen Befehlen, die das FTP-Protokoll definiert, existieren Methoden der Klasse FTP, die grundlegende Operationen auf Dateien und Verzeichnissen durchführen. Tabelle 34.8 fasst die vorhandenen Methoden zusammen und erklärt kurz ihre Bedeutung:

Methode Bedeutung
cwd(pathname) Ändert das aktuelle Arbeitsverzeichnis in pathname.
delete(filename) Löscht die Datei filename.
mkd(pathname) Erzeugt das Verzeichnis pathname.
mlsd([path]) Gibt den Inhalt des aktuellen Arbeitsverzeichnisses bzw. des Verzeichnisses path zurück.
pwd() Gibt den Pfad des aktuellen Arbeitsverzeichnisses zurück.
rename(fromname, toname) Benennt die Datei fromname in toname um.
rmd(dirname) Löscht das Verzeichnis dirname Server. Das Verzeichnis muss vorhanden und leer sein.
size(filename) Ermittelt die Dateigröße der Datei filename.*
* Beachten Sie, dass das dieser Methode zugrunde liegende FTP-Kommando SIZE nicht standardisiert ist und somit nicht von allen FTP-Servern unterstützt wird.

Tabelle 34.8    Datei- und Verzeichnisoperationen auf einem FTP-Server

Die Methode mlsd gibt ein iterierbares Objekt zurück, das die Dateien und Unterverzeichnisse des als Parameter übergebenen Verzeichnisses path auf dem FTP-Server enthält:

>>> for x in ftp.mlsd():
... print("{}: {}".format(x[0], x[1]["type"]))
...
bild.png: file
hallo.txt: file
ordner1: dir
ordner2: dir

Jedes Element im Verzeichnis wird durch ein Tupel mit zwei Einträgen repräsentiert, das den Namen und ein Dictionary mit weiteren Attributen enthält. Im Beispiel wurde neben dem Datei- bzw. Ordnernamen der Wert des Attributs type ausgegeben, das kennzeichnet, ob es sich um eine Datei oder um ein Verzeichnis handelt.

 
Zum Seitenanfang

34.3.4    Übertragen von Dateien Zur vorigen ÜberschriftZur nächsten Überschrift

Zum Austausch einer Datei mit einem FTP-Server müssen zwei grundlegende Entscheidungen getroffen werden: die Richtung des Dateitransfers – eine Datei kann gesendet oder empfangen werden – und der Übertragungsmodus. Jede der vier möglichen Kombinationen dieser Transferparameter wird in der Klasse FTP über eine Methode repräsentiert. Die Methoden heißen retrbinary, retrlines, storbinary und storlines und werden im Folgenden vorgestellt.

Die Methode set_pasv versetzt die FTP-Instanz, abhängig vom übergebenen booleschen Parameter, in den aktiven bzw. passiven Modus. Im aktiven Zustand muss der Client für den Server erreichbar sein, darf sich also nicht hinter einer Firewall oder einem Router befinden.

[»]  Hinweis

Die parameterlose Methode abort unterbricht einen laufenden Datentransfer. Je nach Server kann eine solche Unterbrechung nicht zu jedem Zeitpunkt durchgeführt werden.

retrbinary(cmd, callback, [maxblocksize, rest])

Diese Methode 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 wird das Kommando RETR dateiname verwendet.

An zweiter Stelle muss ein Funktionsobjekt übergeben werden. Die dahinterstehende 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 bytes-Strings übergeben.

Der Parameter maxblocksize bestimmt die maximale Größe der Blöcke, in die die Datei zum Herunterladen aufgeteilt wird.

Über den vierten, optionalen Parameter rest wird ein Offset in der zu übertragenden Datei angegeben, ab dem der Server den Dateiinhalt senden soll. Dies ist zum Beispiel nützlich, um abgebrochene Downloads wieder aufzunehmen, ohne dabei Teile der Datei doppelt herunterladen zu müssen.

Zur Verwendung von retrbinary nun folgendes Beispiel:

>>> class Downloader:
... def __init__(self):
... self.data = bytes()
... def __call__(self, data):
... self.data += data
... bild = Downloader()
... ftp.retrbinary("RETR bild.png", bild)
...
>>> len(bild.data)
473831

Das Beispielprogramm lädt die Bilddatei bild.png aus dem aktuellen Arbeitsverzeichnis des FTP-Servers herunter und speichert die Binärdaten im bytes-String bild.data. Um zum Speichern der Daten nicht auf eine globale Referenz zurückgreifen zu müssen, haben wir eine Klasse Downloader erstellt, die sich mithilfe der Magic Method __call__ wie eine Funktion aufrufen lässt.

Alternativ kann auch ein LIST-Kommando abgesetzt werden. Der Verzeichnisinhalt wird vom Server ebenfalls über den Datenkanal gesendet.

>>> def f(data):
... print(data.decode())
...
>>> ftp.retrbinary("LIST", f)
-rw-r--r-- 1 peter users 473831 Mar 07 17:42 bild.png
-rw-r--r-- 1 peter users 35 Mar 07 17:55 hallo.txt
drwxr-xr-x 2 peter users 4096 Mar 07 17:39 ordner1
drwxr-xr-x 2 peter users 4096 Mar 07 17:39 ordner2

'226 Transfer complete.'

retrlines(command, [callback])

Diese Methode leitet einen Dateitransfer im ASCII-Modus ein. Dazu müssen Sie als ersten Parameter ein entsprechendes FTP-Kommando übergeben. Für einen simplen Dateitransfer wäre dies RETR dateiname. Möglich ist aber beispielsweise auch, den Inhalt des Arbeitsverzeichnisses durch ein LIST-Kommando zu übertragen.

Eine Dateiübertragung im ASCII-Modus erfolgt 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 Sie keine Callback-Funktion angegeben haben, werden die übertragenen Daten ausgegeben.

>>> class Downloader:
... def __init__(self):
... self.lines = []
... def __call__(self, line):
... self.lines.append(line)
...
>>> text = Downloader()
>>> ftp.retrlines("RETR hallo.txt", text)
'226 Transfer complete.'
>>> print("\n".join(text.lines))
Dies ist der Inhalt von hallo.txt

Dieses Beispielprogramm lädt die Textdatei text.txt zeilenweise herunter und fügt die heruntergeladenen Zeilen im String text wieder zu einem Gesamttext zusammen. Dabei bedienen wir uns wieder der aufrufbaren Klasse Downloader, um die Zwischenergebnisse zu speichern.

storbinary(command, file, [blocksize, callback, rest])

Diese Methode leitet einen Datei-Upload ein. Dabei muss als erster Parameter ein entsprechender FTP-Befehl in Form eines bytes-Strings übergeben werden. Für einen simplen Datei-Upload lautet dieser Befehl STOR dateiname, wobei dateiname der Zielname der Datei auf dem FTP-Server ist. Als zweiten Parameter müssen Sie ein im Binärmodus geöffnetes Dateiobjekt übergeben, 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.

Wenn für den vierten Parameter callback das Funktionsobjekt einer Funktion mit einem Parameter übergeben wird, wird diese Funktion nach jedem gesendeten Block gerufen. Dabei bekommt sie die gesendeten Daten als bytes-String übergeben. Der letzte Parameter rest hat die gleiche Bedeutung wie bei retrbinary.

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

f = open("hallo.png", "rb")
ftp.storbinary("STOR bild.png", f)
f.close()

Die Datei heißt im lokalen Arbeitsverzeichnis hallo.png, wird jedoch unter dem Namen bild.png hochgeladen.

storlines(command, file, [callback])

Diese Methode verhält sich ähnlich wie storbinary – mit dem Unterschied, dass die Datei im ASCII-Modus zeilenweise hochgeladen wird. Die Parameter command, file und callback lassen sich wie bei storbinary verwenden.

Beachten Sie, dass Sie das für file übergebene Dateiobjekt wie bei storbinary auch im Binärmodus geöffnet haben müssen.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Python 3 Python 3
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Einstieg in Python
Einstieg in Python


Zum Rheinwerk-Shop: Python. Der Grundkurs
Python. Der Grundkurs


Zum Rheinwerk-Shop: Algorithmen mit Python
Algorithmen mit Python


Zum Rheinwerk-Shop: Objektorientierte Programmierung
Objektorientierte Programmierung


Zum Rheinwerk-Shop: Raspberry Pi. Das umfassende Handbuch
Raspberry Pi. Das umfassende Handbuch


Zum Rheinwerk-Shop: Roboter-Autos mit dem Raspberry Pi
Roboter-Autos mit dem Raspberry Pi


Zum Rheinwerk-Shop: Neuronale Netze programmieren mit Python
Neuronale Netze programmieren mit Python


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2020
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.

 
[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern