Python を使って FTP でファイルのダウンロードを行う方法についてです。以前次のような記事を書きましたが、今回はそのダウンロード版です。
Python には FTP を使うためのそのままずばり ftplib というパッケージが同梱されており、これを使えば Python でかんたんに FTP を使ったファイル送受信が行なえます。しかし、提供されているインタフェースが低レイヤーな感じで、 FTP に詳しい人以外にはあまり直感的ではありません。特にフォルダを扱う処理はかんたんなものでも数行〜のコードを書く必要があります。
今回はそんな ftplib を使ってファイルやフォルダをダウンロードする方法について説明します。アップロードについては上の記事に書いているので興味のある方は参考にしてください。
ファイルをダウンロードする
まずは単一のファイルをダウンロードする方法からです。
from ftplib import FTP_TLS
config = {
'host': 'xx.xx.xx.xx',
'user': 'username',
'passwd': 'password',
}
# sample.txt ファイルをダウンロードする
with FTP_TLS(**config) as ftp:
with open('sample.txt', 'wb') as fp:
ftp.retrbinary('RETR sample.txt', fp.write)ファイルをダウンロードするには ftplib.FTP_TLS (以下 FTP_TLS )のインスタンスを生成してサーバーに接続した上で retrbinary() メソッドを使います。
FTP_TLS は ftplib.FTP (以下 FTP )のサブクラスで TLS をサポートした FTP (いわゆる「 FTPS 」)を行うためのクラスです。いまどき FTP を使うべき理由も無いので原則 ftplib.FTP_TLS 一択と思ってよいでしょう。 FTP_TLS の初期化時には host user passwd の引数を渡します。
retrbinary() メソッドの第一引数には 'RETR ファイルパス' という形式の文字列を渡します。「ファイルパス」というのはサーバー側でのファイルパスです。パスセパレータには / が使えます。
retrbinary() の第二引数には保存先のファイルオブジェクトの write() メソッドを渡します。 retrbinary() はデータをバイナリモードで取得してくるので、保存先のファイルオブジェクトは open('ファイル名', 'wb') で開いておく必要があります。 ちなみに、 retrbinary() と似たメソッドに retrlines() というものもあり、こちらは ASCII モードでデータを取得します。対象のファイルがテキストデータであることがわかっている場合は retrlines() を使ってもよいかもしれません。
ファイル名に日本語を含むファイルをダウンロードする
ファイル名に日本語を含む(正確には文字コード latin-1 では正しく扱えない文字を含む)ファイルを扱う場合は注意が必要です。なぜなら FTP_TLS は( FTP も同じ)デフォルトで文字エンコーディングに latin-1 を使うからです。ファイル名に日本語を含むファイルを扱うときは適切なエンコーディングを使うように設定する必要があります。
参考:
from ftplib import FTP_TLS
ENCODING = 'utf8'
config = {
'host': 'xx.xx.xx.xx',
'user': 'username',
'passwd': 'password',
}
# サンプル.txt ファイルをダウンロードする
with FTP_TLS(**config) as ftp:
ftp.encoding = ENCODING
with open('サンプル.txt', 'wb') as fp:
ftp.retrbinary('RETR サンプル.txt', fp.write)ポイントは ftp.encoding = ENCODING の行です。ここでは UTF8 に設定していますがサーバーの設定に合わせて適切なものを使うようにします。