まだ言語を学んでいる Python の初心者として、ftplib の ftp クラス (Python 3.3 を実行) を使用して単純な ASCII ファイル転送 (STOR/PUT) を実行しようとして数日間苦労しました。
storbinary() メソッドを使用し、一貫して TypeError: "Type str はバッファー API をサポートしていません" を取得した後、このスレッドでの議論を発見しました。これは、Python 3 への ftplib のポートにバグがあることを意味します。
http://bugs.python.org/issue6822
次に、「rb」スイッチを使用して開いたファイル オブジェクトを使用して、storlines() の代わりに storbinary() を使用してみましたが、完全に機能するようです。私は Windows システムで作業しており、テスト/学習の目的で、Linux ホスト上の自分のサイトにアップロードしています。.zip ファイルと .txt ファイルの両方をアップロードし、FileZilla を使用してワークステーションにコピーした後、両方のファイルはそのままです。
私の日常業務では、gzip 圧縮された ASCII ファイルをメインフレームにアップロードする必要があります。適切な転送モードに切り替えるのを忘れて手動の FTP 転送を何度も台無しにしてしまったので、まったく同じコードを使用してバイナリ ファイルと ASCII ファイルの両方を転送できるのは不気味です!
このライブラリ クラスをどのように実装しているかについて、誰かコメントできますか?
ありがとう。
fileName = 'F:\\Data_Folder\\Test_File.txt'
fileParts = os.path.split(fileName)
putFile = fileParts[1]
cmd = 'STOR {}'.format(putFile)
fileObject = open(fileName, 'rb')
ftp.storbinary(cmd, fileObject)
fileName = 'F:\\Data_Folder\\Test_File.zip'
fileParts = os.path.split(fileName)
putFile = fileParts[1]
cmd = 'STOR {}'.format(putFile)
fileObject = open(fileName, 'rb')
ftp.storbinary(cmd, fileObject)
2013 年 6 月 28 日 - ここに戻って、この問題の「ループを閉じる」ようにします。open(fileName, 'rb') を ftp.storbinary() と一緒に使用すると、Windows と Linux の両方のホストをターゲットとして、バイナリと ASCII の両方のテキスト ファイルに対して正常に使用できますが、メインフレームをターゲットとして使用すると、テキスト ファイルが文字化けして、バイナリ ファイルとして表示されます。
ラッパー クラスにスイッチを追加して 'rb' 引数を使用してファイルを開き続けますが、代わりに storlines() を使用して転送を行うと、ファイルはそのまま宛先に到着します。メインフレーム側には、この動作をホストごとに変える可能性のある構成オプションがいくつかある可能性が高いと確信していますが、これについて言及することで、このスレッドに遭遇した人に、明らかに「 open(fileName, 'rb') と storbinary() の安全な組み合わせは、すべての FTP ホスト、特にメインフレーム システムで成功するとは限りません。試行錯誤によってのみ決定される可能性がありますが、ASCII データを転送するための正しいアプローチには、storlines() と一緒に open(fileName, 'rb') が必要になる場合があります。