LoginSignup
0
1

More than 1 year has passed since last update.

サブディレクトリを含むディレクトリ内のファイルを別のディレクトリにコピー

Last updated at Posted at 2021-06-05

コピーするファイルの拡張子はcsv限定となっています。
変更する場合はmain関数のtarget_extを変更する必要があります。

コピーしたファイルのファイル名は、指定したコピー元フォルダを起点とした相対パスのパス区切り文字をアンダーバーに変更したものになります。

import os
import re, shutil
import tkinter.filedialog
import pathlib

def name_savefile_dirname(path):
    file_path = path.replace('/', os.sep) #パスの区切り文字を変換
    org_path = pathlib.Path(org_dir)
    sub_path = pathlib.Path(file_path)
    file_name = sub_path.relative_to(org_path)
    return str(file_name).replace("\\","_")

def copy_files():
    file_list = [] #コピーするファイルのリスト
    filepath_list = [] #コピーするファイルパスのリスト
    for dirpath, dirnames, filenames in os.walk(org_dir): #コピー元のディレクトリを基準にtarget_extで指定した拡張子のファイルをリスト化
        for file in filenames:
            m = re.search(re.escape(target_ext), file) #指定した拡張子のファイルを探す
            if m :
                file_list.append(file) #ファイル名をリストに追加
                filepath_list.append(os.path.join(dirpath, file)) #コピー元ファイルのパスをリストに追加

    for i in range(len(file_list)):
        save_file_path = os.path.join(save_dir, name_savefile_dirname(filepath_list[i])) #コピー先ディレクトリ名とコピー元ディレクトリを付けたファイル名を結合
        shutil.copy2(filepath_list[i], save_file_path) #ファイルをコピー
        print(save_file_path)

if __name__ == '__main__':
    target_ext = '.csv' #コピーするファイルの拡張子
    iDir = os.path.abspath(os.path.dirname(__file__)) #ダイアログ表示の初期ディレクトリ
    org_dir = tkinter.filedialog.askdirectory(initialdir=iDir, title='コピー元のディレクトリ') #コピー元のディレクトリのパス
    save_dir = tkinter.filedialog.askdirectory(initialdir=iDir, title='コピー先のディレクトリ') #コピー先のディレクトリのパス

    copy_files() #メイン関数
    print('finished')
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1