Я пытаюсь автоматизировать загрузку некоторых текстовых файлов из z/os PDS, используя Python и ftplib.
Поскольку файлы хоста имеют формат EBCDIC, я не могу просто использовать FTP.retrbinary().
FTP.retrlines() при использовании с open(file,w).writelines в качестве обратного вызова, конечно, не предоставляет EOL.
Итак, для начала я придумал этот фрагмент кода, который «выглядит нормально для меня», но, поскольку я относительный новичок в Python, может ли кто-нибудь предложить лучший подход? Очевидно, чтобы не усложнять этот вопрос, это не последняя вещь, навороты.
Большое спасибо.
#!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.
z/os PDS имеют фиксированную структуру записей, вместо того, чтобы полагаться на окончания строк в качестве разделителей записей. Однако FTP-сервер z/os при передаче в текстовом режиме предоставляет окончания записей, которые функция retrlines() удаляет.
Закрытие обновления:
Вот мое исправленное решение, которое станет основой для дальнейшей разработки (например, удаление встроенных паролей):
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()
Моя благодарность Джону и Винаю