Загрузка текстовых файлов с помощью Python и ftplib.FTP из z / os

Я пытаюсь автоматизировать загрузку некоторых текстовых файлов из z / os PDS, используя Python и ftplib.

Поскольку файлы хоста имеют формат EBCDIC, я не могу просто использовать FTP.retrbinary ().

FTP.retrlines (), когда используется с open (file, w) .writelines в качестве обратного вызова, конечно, не предоставляет EOL.

Итак, во-первых, я придумала этот фрагмент кода, который мне кажется «нормальным», но, поскольку я относительный нуб-питон, может ли кто-нибудь предложить лучший подход? Очевидно, что для простоты этого вопроса это не последнее, что нужно.

Большое спасибо.

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

Обновление: Python 3.0, платформа MingW под Windows XP.

PDS z / os имеют фиксированную структуру записи, а не полагаются на окончания строк в качестве разделителей записей. Однако FTP-сервер z / os при передаче в текстовом режиме предоставляет окончания записи, которые retrlines () удаляет.

Closing update:

Вот мое пересмотренное решение, которое станет основой для дальнейшей разработки (например, удаление встроенных паролей):

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

Спасибо и Джону, и Винаю

Ответы на вопрос(3)

Ваш ответ на вопрос