我試圖使用Python和ftplib自動從z/os PDS下載一些文本文件。使用Python和ftplib.FTP從z/os下載文本文件
由於主機文件是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()
更新:Python 3.0,平臺是MingW在Windows XP下。
z/os PDSs有一個固定的記錄結構,而不是依靠行結尾作爲記錄分隔符。但是,z/os FTP服務器在文本模式下傳輸時會提供記錄結束,後退()會剝離。
關閉更新:
這是我修改後的解決方案,這將是持續發展的基礎(刪除內置的密碼,例如):
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文件。 「一些文本文件」是相當不足的。 – 2009-07-26 15:58:06
另請說明什麼平臺,什麼版本的Python,以及爲什麼你的writelineswitheol方法附加'\ r \ n'而不是'\ n'。並且請說明您是否真的執行了此操作並檢查了輸出以確保其平臺具有正確的線路終端。 – 2009-07-26 16:32:21
完成。我在corp.firewall外面的家裏做了一些週末的編程工作,所以我只會在本週晚些時候測試這個想法。 – 2009-07-26 16:49:29