このチュートリアルでは、PythonでFTPを使用して、TCP/IP接続を介してサーバーからファイルを送受信する方法を探ります。
より簡単に、より抽象的にするために、Python の ftplib ライブラリを使用する予定です。
サーバーからファイルをアップロードしたりダウンロードしたりするための実装や、「ftplib」が可能にする他のクールなことを見ていきます。
FTPとは何ですか?
FTPはFile Transfer Protocolの略で、クライアント・サーバーモデルのアーキテクチャに基づいており、広く利用されています。
コマンドチャネルとデータチャネルの2つのチャネルを持っています。
コマンドチャネルは通信の制御に使われ、データチャネルは実際のファイル転送に使われます。
FTPを使ってできることは、ファイルの移動、ダウンロード、コピーなど多岐にわたります。
それについては、Pythonを使って行う方法の詳細とともに、後のセクションで説明します。
PythonでFTPを操作する
次に、ftplib
はPythonに既にインストールされているビルトインライブラリなので、スクリプトでインポートするだけで、その機能を使い始めることができることをご存知でしょうか?インポートするには、次のコマンドを使用します。
from ftplib import FTP
その後、通信リンクを開きたいFTPサーバーへの接続を開始する必要があります。
これを行うには、ftp
インスタンスを作成します。
# Replace the example domain with your domain name
ftp = FTP('ftp.example.com')
上記の方法では、サーバーとの接続を確立するために、デフォルトのポート、すなわちポート21を使用します。
次のステップは、サーバー上のファイルにアクセスするためのログイン情報、つまりユーザー名とパスワードを提供することです。
そのためには、以下の方法を使用することができます。
ftp.login('your_username','your_password')
ユーザー名とパスワードのデフォルト値は、それぞれ’anonymous’と’anonymous@’です。
接続に成功すると、「230 Login Successful」のようなメッセージが表示されるはずです。
サーバへの接続が確立されたので、操作、すなわちファイルの取得や書き込みを行いたいディレクトリに移動したいと思います。
そのために、次のコマンドを使用して「現在の作業ディレクトリ」を変更します。
ftp.cwd('/path/to/the/directory/')
それでは、あるディレクトリからファイルを取得したり、あるディレクトリにファイルを書き込んだりする基本的な例について説明しましょう。
コードの説明は、各コードの横にあるコメントで行います。
file_name = 'a-filename.txt'
my_file = open(file_name, 'wb') # Open a local file to store the downloaded file
ftp.retrbinary('RETR ' + file_name, my_file.write, 1024) # Enter the filename to download
上の retrbinary
の呼び出しで、1024 というのは、ファイル全体が転送されるまで、1024 バイトのブロック単位でファイルがダウンロードされることを意味します。
もうひとつ、ファイルをダウンロードしたりアップロードしたりした後で、ファイルを閉じたり、開いていたFTP接続を閉じたりする必要があります。
上記の例では、次の2行のコードでこれを行うことができます。
ftp.quit() # Terminate the FTP connection
my_file.close() # Close the local file you had opened for downloading/storing its content
それでは、ファイルをサーバーにアップロードしてみましょう。
以下のコマンドに加えて、FTP接続を開くために使用したコマンドも書き換える必要があります。
file_name = 'a-filename.txt'
ftp.storbinary('STOR ' + file_name, open(file_name, rb))
上記の例で、’rb’ と ‘wb’ はそれぞれ “read binary” と “write binary” を意味します。
FTPの追加機能
さて、主要な機能の実装について説明しましたが、次に ftplib
が提供する追加機能を見てみましょう。
ファイルとディレクトリの一覧
現在の作業ディレクトリにあるファイルやフォルダをリスト形式で表示するには、retrlines
コマンドを実行します。
ftp.retrlines('LIST')
新規ディレクトリの作成
ある方法でファイルを整理するために、サーバー上に新しいディレクトリを作成する必要性を感じるかもしれません。
ftp.mkd('/path/for/the/directory')
パスは、新しいディレクトリが置かれる場所を指定します。
サーバーからファイルを削除する
サーバー上のファイルを削除するのは非常に簡単で、delete関数のパラメータとしてファイル名を与えるだけです。
操作の成否は、応答メッセージによって伝えられます。
ftp.delete('file_name_to_delete')
現在のパスを確認する
現在のパスを確認するには、以下のコードを実行するだけです。
ftp.pwd()
このコマンドは、現在の作業ディレクトリへの絶対パスを返します。
注意事項
FTP は非常に安全ですが、機密情報の転送にはあまり使われません。
これらのプロトコルは、機密データの転送に最もよく使用されるプロトコルです。
結論
この記事では、FTPとは何か、そしてそれがどのように動作するのかについて、さまざまな例を用いて説明しました。
また、Python の “ftplib” モジュールを使って FTP を使ってリモートサーバーと通信する方法と、このモジュールが提供する他の機能についても見てきました。
最後に、機密情報の転送に使用されるSFTPやSSHのような、FTPのより安全な代替手段についても説明しました。
PythonでFTPを使うためのより詳しい情報は、公式のftplibドキュメントやRFC 959を参照してください。