2019/04/16

pythonでのFTPでのアップロード、ダウンロード

Tags


pythonでFTPを使うには、ftplibをimportすればよい。標準で入っているのでpipなどはする必要がない。

下記の関数では、対象ファイルをバイナリ転送モードにアップロード、ダウンロードとも合わせることで、あげたファイルをそのまま落とすことができるようにしている。'rb'とかstorlinesretrbinaryあたりを合わせるのがポイント。

サンプルとして関数を作ってみた。ローカルにあるテキストファイル"tmp.csv"をアップロードして、サーバーに"test.csv"という名前のファイルで保存される。

(アップロード)
file_name = "test.csv" # サーバーアップロード先でのファイル名
local_file_name = "tmp.csv" # アップロー元のローカルのファイル名

ftp_upload(hostname, username, password, source_path,file_name, server_path,local_file_name)

これをサイドダウンロードすると元どおりになる。

(ダウンロード)
ftp_download(hostname, username, password, source_path,file_name, server_path,local_file_name)

こちらがアップロードとダウンロードの関数。
import ftplib

#---------
hostname = "xxxx" # 接続先サーバーのホスト名
source_path = "xxxx" # アップロード元のパス
server_path = "./xxxx/" # アップロード先のパス
username = "xxxx" # サーバーのユーザー名
password = "xxxx" # サーバーのログインパスワード
#---------


def ftp_upload(hostname, username, password, source_path,file_name, server_path,local_file_name):
    with ftplib.FTP() as ftp:
        try:
            ftp.connect(hostname)   # 接続
            ftp.login(username, password) # ログイン
            ftp.cwd(server_path)        # 指定パスに移動
            with open(source_path + local_file_name, 'rb') as fp:
                ftp.storlines('STOR ' + file_name, fp) 
        except ftplib.all_errors as e:
            print('FTP error = %s' % e)
        #else:
            #print('FTP success.')
            

#ダウンロード
def ftp_download(hostname, username, password, source_path,file_name, server_path,local_file_name):
    with ftplib.FTP() as ftp:
        try:
            ftp.connect(hostname)   # 接続
            ftp.login(username, password) # ログイン
            ftp.cwd(server_path)        # 指定パスに移動
            with open(source_path + local_file_name, 'wb') as fp:
                ftp.retrbinary('RETR ' + file_name, fp.write) 
        except ftplib.all_errors as e:
            print('FTP error = %s' % e)
        #else:
            #print('FTP success.')

(関連コンテンツ)