Descarga de archivos de texto con Python y ftplib.FTP desde z / os

Estoy tratando de automatizar la descarga de algunos archivos de texto desde un z / os PDS, utilizando Python y ftplib.

Dado que los archivos del host son EBCDIC, no puedo simplemente usar FTP.retrbinary ().

FTP.retrlines (), cuando se usa con open (file, w) .writelines como devolución de llamada, no proporciona EOL, por supuesto.

Así que, para empezar, se me ocurrió este código que "me parece bien", pero como soy un noob relativo de Python, ¿alguien puede sugerir un mejor enfoque? Obviamente, para mantener esta pregunta simple, esto no es lo último, campanas y silbidos.

Muchas gracias.

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

Actualización: Python 3.0, la plataforma es MingW en Windows XP.

Los PDS de z / os tienen una estructura de registro fija, en lugar de confiar en los finales de línea como separadores de registro. Sin embargo, el servidor FTP z / os, cuando se transmite en modo de texto, proporciona los finales de grabación, que se retira ().

Actualización de cierre:

Aquí está mi solución revisada, que será la base para el desarrollo continuo (eliminar contraseñas incorporadas, por ejemplo):

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

Mi agradecimiento a John y Vinay

Respuestas a la pregunta(3)

Su respuesta a la pregunta