Herunterladen von Textdateien mit Python und ftplib.FTP von z / os

Ich versuche, das Herunterladen einiger Textdateien von einem z / os-PDS mithilfe von Python und ftplib zu automatisieren.

Da die Hostdateien EBCDIC sind, kann ich FTP.retrbinary () nicht einfach verwenden.

FTP.retrlines () bietet bei Verwendung von open (file, w) .writelines als Rückruf natürlich keine EOLs.

Für den Anfang habe ich mir also diesen Code ausgedacht, der "für mich in Ordnung" aussieht. Aber da ich ein verwandter Python-Neuling bin, kann mir jemand einen besseren Ansatz vorschlagen? Um diese Frage einfach zu halten, ist dies natürlich nicht die letzte Sache.

Danke vielmals.

#!python.exe
from ftplib import FTP

class xfile (file):
    def writelineswitheol(self, sequence):
        for s in sequence:
            self.write(s+"\r\n")

sess = FTP("zos.server.to.be", "myid", "mypassword")
sess.sendcmd("site sbd=(IBM-1047,ISO8859-1)")
sess.cwd("'FOO.BAR.PDS'")
a = sess.nlst("RTB*")
for i in a:
    sess.retrlines("RETR "+i, xfile(i, 'w').writelineswitheol)
sess.quit()

Update: Python 3.0, Plattform ist MingW unter Windows XP.

z / os-PDSs haben eine feste Datensatzstruktur, anstatt sich auf Zeilenenden als Datensatztrennzeichen zu verlassen. Der z / os-FTP-Server stellt jedoch bei der Übertragung im Textmodus die Datensatzenden bereit, wodurch retrlines () entfernt wird.

Abschließendes Update:

Hier ist meine überarbeitete Lösung, die die Grundlage für die weitere Entwicklung sein wird (z. B. das Entfernen integrierter Kennwörter):

import ftplib
import os
from sys import exc_info

sess = ftplib.FTP("undisclosed.server.com", "userid", "password")
sess.sendcmd("site sbd=(IBM-1047,ISO8859-1)")
for dir in ["ASM", "ASML", "ASMM", "C", "CPP", "DLLA", "DLLC", "DLMC", "GEN", "HDR", "MAC"]:
    sess.cwd("'ZLTALM.PREP.%s'" % dir)
    try:
        filelist = sess.nlst()
    except ftplib.error_perm as x:
        if (x.args[0][:3] != '550'):
            raise
    else:
        try:
            os.mkdir(dir)
        except:
            continue
        for hostfile in filelist:
            lines = []
            sess.retrlines("RETR "+hostfile, lines.append)
            pcfile = open("%s/%s"% (dir,hostfile), 'w')
            for line in lines:
                pcfile.write(line+"\n")
            pcfile.close()
        print ("Done: " + dir)
sess.quit()

Mein Dank geht an John und Vinay

Antworten auf die Frage(3)

Ihre Antwort auf die Frage