Rekursiv Ordner erstellen: Stimmt das so?
Verfasst: Donnerstag 11. September 2014, 10:18
Hallo,
ich möchte mit Paramiko einen Ordner erstellen. Leider hat dort die Funktion mkdir keine Option -p wie das unter dem Unix-mkdir der Fall wäre (Also dass auch alle übergeordneten Ordner erstellt werden). Daher habe ich notgedrungen so etwas selber erstellt. Da das mein erster Versuch mit Rekursion ist, wollte ich fragen, ob sich das jemand anschauen könnte und mir einige Tipps geben könnte? Also funktionierten tut der Code, aber vielleicht ist er etwas unschön.
Danke!
ich möchte mit Paramiko einen Ordner erstellen. Leider hat dort die Funktion mkdir keine Option -p wie das unter dem Unix-mkdir der Fall wäre (Also dass auch alle übergeordneten Ordner erstellt werden). Daher habe ich notgedrungen so etwas selber erstellt. Da das mein erster Versuch mit Rekursion ist, wollte ich fragen, ob sich das jemand anschauen könnte und mir einige Tipps geben könnte? Also funktionierten tut der Code, aber vielleicht ist er etwas unschön.
Code: Alles auswählen
def _mkdir(self, remote_path, stripped_remote_path=None):
"""
Erstellt so lange Ordner mit self._sftp.mkdir, bis der gewünschte Ordner erstellt ist.
(Paramikos mkdir hat keine -p Option wie mkdir von Unix, deswegen muss man die Ordner
rekursiv erstellen).
Siehe auch http://stackoverflow.com/questions/4409502/directory-transfers-on-paramiko
:param remote_path: Der (eigentliche) Pfad, der erstellt werden soll.
:param stripped_remote_path: Der um ein Segment verkürzte Pfad (nur wichtig für Rekursion)
"""
if remote_path.endswith("/"):
remote_path = remote_path[:-1]
#Methode:
#Zuerst wird versucht, den ursprünglichen Pfad zu erstellen. Wenn das nicht geht (wegen
#IO-Error), wird ein Ordnersegment abgezogen und diese Funktion wieder aufgerufen
#(Rekursion), mit dem zusätzlichen Argument stripped_remote_path. Anschließend wird im
#zweiten Durchlauf versucht, den gekürzten Ordner zu erstellen. Wenn das geht, wird die
#Funktion wieder wie zu Beginn aufgerufen. Ansonsten wird noch ein Ordnersegment abgezogen.
try:
if stripped_remote_path is None:
self._sftp.mkdir(remote_path)
else:
self._sftp.mkdir(stripped_remote_path)
self._mkdir(remote_path)
except IOError as e:
if stripped_remote_path is None:
stripped_remote_path = remote_path
self._mkdir(remote_path, stripped_remote_path.rsplit("/", 1)[0])