概要
GISで添付ファイルなどをつける際に、私はよくこのツールを使用して、一括で名前を付け替えていました。
あるフォルダに格納されているファイルを、別のフォルダに移動(コピー)するツールです。
csvでpathも含めた新旧のファイル名を作成し、一気に名前を付け替えることができます。
もし良ければ使用してみてください。
Pythonのコードになります。
コード
import os
import shutil
import pandas as pd
import tkinter as tk
from tkinter import filedialog, messagebox
import logging
import chardet
def setup_logging():
“””ログファイルを設定する”””
log_path = ‘file_copy_log.log’
skipped_log_path = ‘skipped_files_log.txt’
logging.basicConfig(
filename=log_path,
level=logging.WARNING, # WARNING 以上のログを記録
format=’%(asctime)s – %(levelname)s – %(message)s’
)
# スキップしたファイルのログを初期化
with open(skipped_log_path, ‘w’, encoding=’utf-8′) as f:
f.write(“======== スキップしたファイルのリスト ========\n”)
logging.warning(“========== 新しいログセッションを開始しました ==========”)
def detect_encoding(file_path):
“””ファイルのエンコーディングを自動検出する”””
with open(file_path, “rb”) as file:
raw_data = file.read()
result = chardet.detect(raw_data)
return result[“encoding”]
def select_csv_file():
“””CSVファイルを選択するダイアログを表示”””
file_path = filedialog.askopenfilename(
title=”CSVファイルを選択してください”,
filetypes=[(“CSVファイル”, “*.csv”)]
)
if file_path:
csv_path_var.set(file_path)
def select_folder():
“””保存先のフォルダを選択するダイアログを表示”””
folder_path = filedialog.askdirectory(title=”保存先フォルダを選択してください”)
if folder_path:
folder_path_var.set(folder_path)
def copy_files_from_csv():
“””CSVからold_urlからnew_urlにファイルをコピーする”””
csv_path = csv_path_var.get()
if not csv_path or not os.path.isfile(csv_path):
messagebox.showerror(“エラー”, “有効なCSVファイルを指定してください。”)
return
try:
# CSVの文字コードを自動検出
encoding = detect_encoding(csv_path)
# CSVファイルを読み込む
file_data = pd.read_csv(csv_path, encoding=encoding)
if ‘old_url’ not in file_data.columns or ‘new_url’ not in file_data.columns:
messagebox.showerror(“エラー”, “CSVファイルに ‘old_url’ または ‘new_url’ 列が見つかりません。”)
logging.error(“CSVファイルに ‘old_url’ または ‘new_url’ 列が見つかりません。”)
return
copied_files = 0
skipped_files = 0
skipped_log_path = ‘skipped_files_log.txt’
for index, row in file_data.iterrows():
old_path = row[‘old_url’]
new_path = row[‘new_url’]
# old_urlがファイルとして存在するか確認
if os.path.isfile(old_path):
try:
# new_urlのディレクトリを作成
new_dir = os.path.dirname(new_path)
os.makedirs(new_dir, exist_ok=True)
# ファイルをコピー
shutil.copy2(old_path, new_path)
copied_files += 1
except Exception as e:
error_message = f”コピーエラー: {old_path} から {new_path} へのコピーに失敗しました。理由: {e}”
logging.error(error_message)
with open(skipped_log_path, ‘a’, encoding=’utf-8′) as f:
f.write(f”{error_message}\n”)
skipped_files += 1
else:
warning_message = f”ファイルが見つかりません: {old_path}”
logging.warning(warning_message)
with open(skipped_log_path, ‘a’, encoding=’utf-8′) as f:
f.write(f”{warning_message}\n”)
skipped_files += 1
messagebox.showinfo(“完了”, f”{copied_files} 個のファイルをコピーしました。\n{skipped_files} 個のファイルをスキップしました。\n詳細は ‘skipped_files_log.txt’ に記録されています。”)
logging.warning(f”コピーが完了しました。{copied_files} 個のファイルをコピーし、{skipped_files} 個のファイルをスキップしました。”)
except Exception as e:
logging.error(f”スクリプトの実行中にエラーが発生しました: {e}”)
messagebox.showerror(“エラー”, f”スクリプトの実行中にエラーが発生しました: {e}”)
# ログの設定
setup_logging()
# UIの設定
root = tk.Tk()
root.title(“ファイルコピー ツール”)
# 変数
csv_path_var = tk.StringVar()
folder_path_var = tk.StringVar()
# CSVファイルの選択
tk.Label(root, text=”CSVファイル:”).grid(row=0, column=0, padx=5, pady=5, sticky=”w”)
tk.Entry(root, textvariable=csv_path_var, width=50).grid(row=0, column=1, padx=5, pady=5)
tk.Button(root, text=”選択”, command=select_csv_file).grid(row=0, column=2, padx=5, pady=5)
# 保存先フォルダの選択(オプション)
tk.Label(root, text=”保存先フォルダ (オプション):”).grid(row=1, column=0, padx=5, pady=5, sticky=”w”)
tk.Entry(root, textvariable=folder_path_var, width=50).grid(row=1, column=1, padx=5, pady=5)
tk.Button(root, text=”選択”, command=select_folder).grid(row=1, column=2, padx=5, pady=5)
# 実行ボタン
tk.Button(root, text=”実行”, command=copy_files_from_csv, width=20).grid(row=2, column=0, columnspan=3, pady=10)
# UIの表示
root.mainloop()
使用方法
old_url(移動前のファイルのフルpath)とnew_url(移動後のファイルのフルpath)
を記載したものを用意します。
csvファイルはUTF-8で保存します。
エクセルなどで作成し、csvで保存すると良いと思います。
例:
old_url,new_url
D:\test\no1\test.txt,D:\test\no2\sagyo.txt
作成後、.pyファイルを実行します。
必要なライブラリは事前にインストールしておきます。
作成したcsvと保存先を選択します。保存先は、手前のディレクトリまでで問題ないです。
選択後、実行を押すと、ファイルが作成されます。
※コピーできなかったものについては、ログが出力されます。