5

ftplib を使用して Python でファイルをダウンロードしていますが、最近まではすべて正常に動作しているように見えました。私はそのようにファイルをダウンロードしています:

ftpSession = ftplib.FTP(host,username,password)
ftpSession.cwd('rlmfiles')
ftpFileList = filter(lambda x: 'PEDI' in x, ftpSession.nlst())
ftpFileList.sort() 
for f in ftpFileList:
    tempFile = open(os.path.join(localDirectory,f),'wb')
    ftpSession.retrbinary('RETR '+f,tempFile.write)
    tempFile.close()
ftpSession.quit()
sys.exit(0)

最近まで、必要なファイルを正常にダウンロードしていました。しかし、現在、ダウンロードしているファイルが破損しており、ガベージ ASCII の長い文字列が含まれているだけです。私は、同じ FTP からこれを正常に実行する Perl スクリプトも持っているため、それらをプルしている FTP に投稿されたファイルではないことを知っています。

追加情報である場合、ファイルをダウンロードするときにデバッガーがコマンド プロンプトに出力する内容は次のとおりです。

ここに画像の説明を入力

retrbinary()Python の ftplibを使用してファイルの内容が破損するという問題に遭遇した人はいますか?

私は本当に立ち往生/イライラしており、ここで破損の可能性に関連するものに遭遇していません. どんな助けでも大歓迎です。

4

1 に答える 1

2

昨日、テキスト ファイルをダウンロードしようとしたときに、この問題に遭遇しました。それがあなたがしていたことかどうかはわかりませんが、ASCII ガベージが含まれていると言うので、テキストであるはずだったので、テキスト エディターで開いたと思います。

この場合、ファイルがテキスト ファイルであり、バイナリ モードでダウンロードしようとしていることが問題です。

代わりに、ASCII 転送モードでファイルを取得する必要があります。

tempFile = open(os.path.join(localDirectory,f),'w')  # Changed 'wb' to 'w'
ftpSession.retrlines('RETR '+f,tempFile.write)       # Changed retrbinary to retrlines

残念ながら、これによりすべての改行文字がファイルから削除されます。うん!

したがって、削除された改行文字を再度追加する必要があります。

tempFile = open(os.path.join(localDirectory,f),'w')
textLines = []
ftpSession.retrlines('RETR '+f,textLines.append)
tempFile.write('\n'.join(textLines))

これは機能するはずですが、見栄えがよくありません。したがって、少しクリーンアップするだけで次のようになります。

temporaryFile   = open(os.path.join(localDirectory, currentFile), 'w')
textLines       = []
retrieveCommand = 'RETR '

ftpSession.retrlines(retrieveCommand + currentFile, textLines.append)
temporaryFile.write('\n'.join(textLines))
于 2016-09-22T21:51:57.460 に答える