Python 및 ftplib을 사용하여 z/os PDS에서 일부 텍스트 파일 다운로드를 자동화하려고합니다.z/o에서 Python 및 ftplib.FTP로 텍스트 파일 다운로드
호스트 파일이 EBCDIC이기 때문에 단순히 FTP.retrbinary()를 사용할 수 없습니다.
콜백으로 open (file, w) .writelines와 함께 사용되는 FTP.retrlines()는 물론 EOL을 제공하지 않습니다.
처음에는 "나에게 잘 어울리는"코드 조각을 생각해 냈습니다.하지만 필자가 상대적인 파이썬 놈 (Python noob)으로서 더 나은 접근 방법을 제안 할 수 있습니까? 분명히,이 질문을 간단하게 유지하기 위해, 이것은 마지막 종소리와 휘파람 물건이 아닙니다.
감사합니다.
#!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()
업데이트 : 플랫폼은 Windows XP에서 MingW입니다.
z/os PDS는 줄 끝을 레코드 구분 기호로 사용하지 않고 고정 된 레코드 구조를 가지고 있습니다. 그러나 z/os FTP 서버는 텍스트 모드로 전송할 때 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()
내 감사 : 여기
(예를 들어, 제거 내장 된 암호) 지속적인 개발을위한 기초가 될 것입니다 내 수정 된 솔루션입니다 Vinay
질문을 편집하고 PDS 파일을 설명하십시오. "일부 텍스트 파일"은 다소 부적합합니다. –
또한 어떤 플랫폼, 어떤 Python 버전 및 writelineswitheol 메서드가 '\ n'대신 '\ r \ n'을 추가하는지 알려주십시오. 그리고 실제로 이것을 실행했는지 여부를 명시하고 출력 결과를 점검하여 플랫폼에 올바른 회선 종단 처리가 이루어 졌는지 확인하십시오. –
완료. 나는 주말에 corp.firewall 밖에서 집에서 코딩을하고 있기 때문에 이번 주말에 그 아이디어를 테스트 할 것입니다. –