ファイルコピー&リネームツール

概要

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と保存先を選択します。保存先は、手前のディレクトリまでで問題ないです。

選択後、実行を押すと、ファイルが作成されます。

※コピーできなかったものについては、ログが出力されます。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です