2007/06/13

Pythonの勉強のために

Python Workshop the Edge 2007のお題をやって見ようと思う。
お題1:ファイルの同期 (Python Workshop the Edge 2007)

お題1:ファイルの同期

二つのディレクトリ下のタイムスタンプを比較して、同期を取るプログラムを作りたい。

二つのディレクトリ(フォルダ)を指定すると、そのディレクトリの下の全てのファイルについて「片方にしかないファイルはもう片方へコピーし、両方にあるけどもタイムスタンプ(更新時刻)の異なるファイルは新しい方で古い方を上書きする」という処理を行うプログラムを作りなさい。

で、作ってみた。
#! /usr/bin/env python2.5
# -*- coding: utf-8 -*-

from os import listdir, stat, sep;
from os.path import getmtime;
from shutil import copy2;

## sync
# 二つのディレクトリを比較し、同期をとる。
# filesX = ディレクトリの中身の集合
# to1Files = ディレクトリ1へコピーするファイル集合(2にしかないファイル集合)
# to2Files = ディレクトリ2へコピーするファイル集合(1にしかないファイル集合)
# bothFiles = 両方のディレクトリにあるファイル集合(後でタイムスタンプを比較するファイル集合)
def sync(dir1, dir2):
   #ディレクトリ1,2それぞれのファイル集合を作成
   files1 = set(listdir(dir1));
   files2 = set(listdir(dir2));

   #どのファイルをどのsetに入れるか振り分ける。
   to1Files = files2.difference(files1);
   to2Files = files1.difference(files2);
   bothFiles = files1.intersection(files2);

   #bothFilesに含まれるファイルのタイムスタンプを比較し振り分ける
   for file in bothFiles:
      #比較するファイルのパス作成
      file1 = dir1 + sep + file;
      file2 = dir2 + sep + file;

      #タイムスタンプの比較と振り分け。
      if (getmtime(file1) > getmtime(file2)):
         to2Files.add(file);
      elif (getmtime(file2) > getmtime(file1)):
         to1Files.add(file);
   
   # to1Files,to2Filesのファイルをコピーすべきディレクトリへコピーする
   for file in to1Files:
      copy2(dir2 + sep + file, dir1 + sep + file);
   for file in to2Files:
      copy2(dir1 + sep + file, dir2 + sep + file);
   
if (__name__ == "__main__"):
   from sys import argv, exit;
   if (len(argv) != 3):
      print "ディレクトリを2つ指定して下さい。";
      exit();
   
   sync(argv[1],argv[2]);
最初は無駄にクラス作っていたけれど削りに削って最終的にこんな感じになりました。
ほかのお題もやってみようかしら?

0 件のコメント: