私はPythonとftplibを使って、z/os PDSからいくつかのテキストファイルのダウンロードを自動化しようとしています。Pythonとftplib.FTPでテキストファイルをダウンロードする
ホストファイルはEBCDICなので、単にFTP.retrbinary()を使うことはできません。
FTP.retrlines()は、open(file、w).writelinesをコールバックとして使用してももちろん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プラットフォームは、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の外で自宅でいくつかの週末のコーディングをしているので、私は今週の後半にそのアイデアをテストしています。 –