cojimaru BLOG

エンジニア支援のために技術情報を発信するブログ

python ftplibによるファイルのダウンロード・アップロードを行ってみた

f:id:cojimaru-chan:20210304010950p:plain

はじめに

どうも、こじまるです。

pythonFTPサーバのファイルをダウンロード、アップロードする方法』をお探しではないでしょうか?そんな方に向けて、pythonの標準ライブラリftplibを使ったファイルダウンロード・アップロードの方法を記事にまとめました。

この記事をみてわかること
  • ftplibを使ったファイルダウンロード・アップロードの方法


本記事で紹介する方法を実践すれば、pythonを使ってFTPサーバのファイルをダウンロード・アップロードすることができます。

ftplibを使ったファイルダウンロード・アップロード

ftplibとは

ftplibとは、pythonに同梱されている標準ライブラリです。なので、pipでインストールする作業は不要になります。

ファイルのダウンロード

FTPサーバ上のファイル(test.txt)をsample.txtという名前でローカルにダウンロードすることを例に説明します。

FTPサーバへのログイン

まず、FTPサーバにアクセスするためにFTPクラスのインスタンスを作成します。FTPクラスはwith構文がサポートされているため、下記のように記述できます。

host = '127.0.0.1'
with FTP(host) as ftp:
    ftp.login() # login as anonymous user

FTPサーバで匿名ユーザ(anonymous user)を許可している場合、FTP.loginメソッドは引数なしで実行できます。特定のユーザでログインしたい場合には、FTP.loginメソッドの引数にユーザ名、パスワードを追加してください。


カレントディレクトリの変更

FTPサーバ上のダウンロード対象のファイルパスに応じて、カレントディレクトリを変更する必要があります。

FTP.cwd(pathname)

FTP.cwdメソッドのpathnameにカレントディレクトリを指定することで変更できます。今回はFTPサーバでログインしたパス(物理パス)の直下にtest.txtが配置されているため、変更は不要です。


リモートからローカルへのファイルダウンロード

ローカルのsample.txtというファイルを'wb'モードでファイルオープンし、FTP.retrbinaryメソッドによりバイナリ転送モードでファイルを受信します。

cmd = 'RETR test.txt'
with open('sample.txt','wb') as local_file:
    ftp.retrbinary(cmd, local_file.write)

FTP.retrbinaryメソッドの第一引数cmdには適切な'RETR filename'という形式で指定する必要があります。FTPのcommandについてはこちらをご確認ください。


ソースコード

全体のソースコードは下記の通りです。

from ftplib import FTP, error_perm, all_errors

def copyFile(src, dest):
    host = '127.0.0.1'
    cmd = 'RETR test.txt'
    try:
        with FTP(host) as ftp:
            ftp.login() # login as anonymous user
            lists = ftp.nlst()
            print(lists)
            if src in lists:
                print('file is existed')
                with open(dest,'wb') as local_file:
                    ftp.retrbinary(cmd, local_file.write)
                    print('copy is done')
            else:
                print('file is not existed')
    except error_perm:
        print('Pemission denined')
    except all_errors:
        print('Internal server error')

if __name__ == '__main__':
    src = 'test.txt'
    dest = 'sample.txt'
    copyFile(src, dest)
実行結果

FTPサーバは下記のように物理パスを設定しました。
f:id:cojimaru-chan:20210303224604j:plain



また、FTPサーバにはtest.txtを配置しました。
f:id:cojimaru-chan:20210303223148j:plain



スクリプトの実行結果として、ローカルにsample.txtという名前でダウンロードすることができました。
f:id:cojimaru-chan:20210303223200j:plain


ファイルのアップロード

ローカルのファイル(sample.txt)をFTPサーバ上にhoge.txtという名前でアップロードすることを例に説明します。

ローカルからリモートへのファイルアップロード

ローカルのsample.txtというファイルを'rb'モードでオープンし、FTP.storbinaryメソッドによりバイナリ転送モードでファイルを転送します。

cmd = 'STOR hoge.txt'
with open('sample.txt','rb') as local_file:
    ftp.storbinary(cmd, local_file)

FTP.storbinaryメソッドの第一引数cmdには'STOR filename'という形式で指定します。FTP.storbinaryメソッドの第二引数はファイルオブジェクトになりますので、ファイルオープンで開いたファイルオブジェクト local_fileを指定します。


ソースコード

全体のソースコードは下記の通りです。

from ftplib import FTP, error_perm, all_errors
import os

def uploadFile(src, dest):
    host = '127.0.0.1'
    cmd = 'STOR ' + dest
    try:
        with FTP(host) as ftp:
            ftp.login() # login as anonymous user
            lists = os.listdir('.')
            if src in lists:
                print('file is existed')
                with open(src,'rb') as local_file:
                    ftp.storbinary(cmd, local_file)
                    print('upload is done')
            else:
                print('file is not existed')
    except error_perm:
        print('Pemission denined')
    except all_errors:
        print('Internal server error')

if __name__ == '__main__':
    src = 'sample.txt'
    dest = 'hoge.txt'
    uploadFile(src, dest)
実行結果

スクリプトの実行結果として、FTPサーバにhoge.txtという名前でアップロードすることができました。
f:id:cojimaru-chan:20210303224401j:plain

まとめ

最後に、ご紹介した内容をおさらいしていきます。


pythonで標準ライブラリftplibを使用することで、下記が実現できることを紹介いたしました。

pythonを使ってFTPサーバのファイルをダウンロード・アップロードすること

ご紹介した内容を実践すれば、初心者の方でもpythonを使ってFTPサーバのファイルをダウンロード・アップロードすることができます。


pythonを使った他の記事も書いていますので、ぜひ見てください。
cojimaru-chan.hatenablog.com