Pobieranie plików tekstowych za pomocą Pythona i ftplib.FTP z z / os
Próbuję zautomatyzować pobieranie niektórych plików tekstowych z PDS z / os, używając Pythona i ftpliba.
Ponieważ pliki hosta są EBCDIC, nie mogę po prostu użyć FTP.retrbinary ().
FTP.retrlines (), gdy jest używany z open (file, w) .writelines jako wywołaniem zwrotnym, nie zapewnia oczywiście EOL.
Na początek wymyśliłem ten fragment kodu, który „wygląda dobrze dla mnie”, ale ponieważ jestem względnym noobem Pythona, czy ktoś może zaproponować lepsze podejście? Oczywiście, aby to pytanie było proste, nie jest to ostatnia rzecz, dzwonki i gwizdki.
Wielkie dzięki.
#!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()
Aktualizacja: platforma Python 3.0 to MingW w systemie Windows XP.
PDS z / os mają stałą strukturę rekordów, zamiast polegać na zakończeniach linii jako separatorach rekordów. Jednak serwer FTP z / os, podczas transmisji w trybie tekstowym, dostarcza końcówki rekordów, które przesuwają () paski.
Zamknięcie aktualizacji:
Oto moje poprawione rozwiązanie, które będzie podstawą ciągłego rozwoju (na przykład usuwanie wbudowanych haseł):
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()
Moje podziękowania dla Johna i Vinaya