Fazendo o download de arquivos de texto com Python e ftplib.FTP a partir do z / os

Eu estou tentando automatizar o download de alguns arquivos de texto de um PDS do z / os, usando Python e ftplib.

Como os arquivos do host são EBCDIC, não posso simplesmente usar o FTP.retrbinary ().

FTP.retrlines (), quando usado com arquivos de texto abertos (file, w) como seu retorno de chamada, não fornece, naturalmente, EOLs.

Então, para começar, eu criei este pedaço de código que "parece certo para mim", mas como sou um noob relativo de Python, alguém pode sugerir uma abordagem melhor? Obviamente, para manter esta questão simples, esta não é a coisa final, sinos e assobios.

Muito Obrigado.

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

Atualização: Python 3.0, a plataforma é MingW no Windows XP.

Os PDSs do z / os têm uma estrutura de registro fixa, em vez de depender de terminações de linha como separadores de registro. No entanto, o servidor FTP do z / os, ao transmitir no modo de texto, fornece as terminações de registro, que as retinas () retiram.

Atualização de fechamento:

Aqui está minha solução revisada, que será a base para o desenvolvimento contínuo (removendo senhas internas, por exemplo):

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

Meus agradecimentos a John e Vinay

questionAnswers(3)

yourAnswerToTheQuestion