コピーするファイルの拡張子は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')