HOME | Python | 書き込む |
100 行ほどの短いスクリプトで書くことができます。 このスクリプトは短いのですが、それなりのテクニックを使っているので、 皆様の参考になればと思い、紹介します。
書式は、
("server.name", "user_name", "password", "sub-folder", ("filename1", "filename2", ........,))
のようにタプルでくくって、
サーバー名、ユーザー名、パスワード、サーバー上の保存するディレクトリ( HOME からの相対パス)、
および転送するファイルのリストです。
このようにしておくと eval を使って変数を簡潔に読み込むことができます。
入力ファイルは読み終わったらすぐに削除します。
成功したか、どこでエラーが起きたかを書き込みます。
01: #! /usr/bin/env python 02: 03: import os, os.path, sys 04: from ftplib import FTP 05: from cStringIO import StringIO 06: from datetime import datetime 07: 08: """ 09: upload.py 10: 11: by T.Shido 12: on July 19, 2005 13: 14: """ 15: 16: 17: INP = 'upload.inp' 18: LOG = 'upload.log' 19: 20: def is_ascii(fname): 21: return fname.split('.').pop() in ('txt', 'htm', 'html', 'css') 22: 23: def write_log(logfile, str, success): 24: log = file(logfile, 'w') 25: log.write( ((not success) and 'Error:\n\n' or '') + str) 26: log.close() 27: success or sys.exit(1) 28: 29: def server_cd(ftp, path, log_name): 30: if path!='HOME': 31: stdout = sys.stdout 32: for d in path.split('/'): 33: sys.stdout = StringIO() 34: try: 35: ftp.dir() 36: except: 37: ftp.close() 38: write_log(log_name, "Cannot get LIST", False) 39: 40: if not d in [line.split(' ').pop() for line in sys.stdout.getvalue().split('\n') if line and line[0]=='d']: 41: try: 42: ftp.mkd(d) 43: except: 44: ftp.close() 45: write_log(log_name, "Cannot make directory on the server: " + d, False) 46: try: 47: ftp.cwd(d) 48: except: 49: ftp.close() 50: write_log(log_name, "Cannot change directory on the server: " + d, False) 51: 52: sys.stdout.close() 53: sys.stdout = stdout 54: 55: 56: def put(ftp, ls, log_name): 57: for fname in ls: 58: fbase = os.path.basename(fname) 59: (method, mode) = is_ascii(fbase) and ('storlines', 'r') or ('storbinary', 'rb') 60: try: 61: f = file(fname, mode) 62: except: 63: ftp.close() 64: write_log(log_name, "Cannot open local file: " + fbase, False) 65: try: 66: getattr(ftp, method)("STOR " + fbase, f) 67: except: 68: ftp.close() 69: write_log(log_name, "Cannot Transfer local file: " + fbase, False) 70: 71: f.close() 72: 73: if __name__ == '__main__': 74: dtemp = os.getenv("TEMP") or os.getenv("TMP") or "C:\\" 75: log_name = os.path.join(dtemp, LOG) 76: os.path.exists(log_name) and os.remove(log_name) 77: inp_name = os.path.join(dtemp, INP) 78: try: 79: inp = file(inp_name) 80: except: 81: write_log(log_name, "Cannot open input file.", False) 82: 83: server, user, passw, path, files = eval(inp.read()) 84: inp.close() 85: os.remove(inp_name) 86: 87: try: 88: ftp = FTP(server) 89: except: 90: write_log(log_name, "Cannot connect to " + server, False) 91: 92: try: 93: ftp.login(user, passw) 94: except: 95: ftp.close() 96: write_log(log_name, "Cannot login: " + server, False) 97: 98: server_cd(ftp, path, log_name) 99: put(ftp, files, log_name) 100: ftp.quit() 101: write_log(log_name, 102: "Following files are uploaded successfully at\n%s:\n\n" % datetime.now().isoformat(' ') + \ 103: "\n".join(files) + "\n", 104: True)
詳しくは ライブラリリファレンス 11.7 ftplib -- FTPプロトコルクライアント を参照してください。
詳しくは、 Python ライブラリリファレンス 4.6 StringIO および、 4.7 cStringIO を見てください。
01: def put(ftp, ls): 02: for fname in ls: 03: fbase = os.path.basename(fname) 04: if is_ascii(fbase): 05: try: 06: f = file(fname, 'r') 07: except: 08: ftp.close() 09: write_log(log_name, "Cannot open local file: " + fbase, False) 10: try: 11: ftp.storline("STOR " + fname, f) 12: except: 13: ftp.close() 14: write_log(log_name, "Cannot Transfer local file: " + fbase, False) 15: f.close() 16: 17: else: 18: try: 19: f = file(fname, 'rb') 20: except: 21: ftp.close() 22: write_log(log_name, "Cannot open local file: " + fbase, False) 23: try: 24: ftp.storbinary("STOR " + fname, f) 25: except: 26: ftp.close() 27: write_log(log_name, "Cannot Transfer local file: " + fbase, False) 28: f.close()
01: # Copy geometry methods of self.frame -- hack! 02: methods = Pack.__dict__.keys() 03: methods = methods + Grid.__dict__.keys() 04: methods = methods + Place.__dict__.keys() 05: 06: for m in methods: 07: if m[0] != '_' and m != 'config' and m != 'configure': 08: setattr(self, m, getattr(self.frame, m))まず、widget を配置するメソッドである Pack, Grid, Place の名前空間からメソッド、クラス変数を取り出し、 self.frame におけるそれらの値を self の属性としています。 こうすると、ScrolledText は1つのオブジェクトとして、配置できます。 また、Dive Into Python にもこれらの関数の便利な使い方が 載っています。
例:
import socket from ftplib import FTP socket.defaulttimeout(30.0) # 以降作られるソケットは 30 秒後にタイムアウト ftp = FTP(fit.site.somewhere) ftp.login("me", "mypassward") .....................................
Python ライブラリが完備しているので便利なプログラムを短い行数でかけます。
HOME | Python | 書き込む |