見出し画像

退屈なことをPythonにやってもらうための演習の回答[9.7.1]

白地です。

『退屈なことはPythonにやらせよう』演習プロジェクトの9.7.1の、自分なりの解答です。

久々に作ってみましたが、if文の書き方をミスったりと凡ミスしまくりました。

設計とまでいかないまでも、問題文に与えられていない情報を自分でどう補うかで時間を取ってしまいますね。

フォルダの指定方法、特定の拡張子は何か、拡張子は複数指定されるのか、新しいフォルダはどこに置くのか、同名のファイルがあった場合はどうするのか、などなど……エンジニアさんが論理的になる訳です。

なお、Pythonのバージョンが3.4以上の場合はos.pathではなくpathlibを使うべしという記事を拝見したのですが、とりあえずos.pathを使っています。

#! python3
# 9.7.1 選択コピー
# ディレクトリツリーを渡り歩いて、.pdfや.jpgなどの特定の拡張子を持つファイルを見つけ、
# 新しいフォルダにコピーするプログラム

# 第1引数 : ディレクトリ(そのディレクトリ以下を探索し、そのディレクトリ直下にファイルを置く)
# 出力 : なし

import sys, os, shutil
from datetime import datetime

# 拡張子は決定されているものとする。今回はpngとする。複数の拡張子は考慮しない
designated_extension = "png"

# 第1引数を見る(エラーは強制終了)
try:
    dirpath = sys.argv[1]
except IndexError:
    print('Please specify the file you want to convert to argument.')
    sys.exit(1)

# ディレクトリかどうか確認し、ディレクトリでなければ強制終了
if os.path.isdir(dirpath)==False :
    print('Please specify the Dir.')
    sys.exit(1)

# 新しいフォルダ名、かぶりたくないので日付から生成
new_dirname = designated_extension + datetime.now().strftime("%Y%m%d%H%M%S")

# フォルダ名をパスに変換
new_dir = os.path.join( dirpath, new_dirname )

# フォルダを作成。同名フォルダの存在は考慮しない
os.mkdir( new_dir )

# 指定されたディレクトリからディレクトリツリーを渡り歩き、ファイルを見つける
# 見つけたファイルを新しいディレクトリへコピーする。同名のファイルは考慮しない。

for foldername, subfolders, filenames in os.walk(dirpath):

    # 作成したディレクトリの中からもコピーしようとするのでスキップ処理
    if( os.path.basename(foldername) == new_dirname ):
        continue

    for filename in filenames:

        # 拡張子が designated_extension だったらファイルをコピーする
        _ , ext = os.path.splitext(filename)

        if( ext == '.' + designated_extension ):
            src = os.path.join( foldername, filename )
            shutil.copy( src , new_dirname )

この記事が気に入ったらサポートをしてみませんか?