python 指名手配
どっすん ばったん
ファイル整理の
こころ強い 見方 味方
に
なるか???
【Gemini】様 に
ファイル捜索の
スクリプトを 作成して
いただいたので
Online Backup
# ### 🛠 修正・改造のポイント
# 1. **カレントディレクトリの移動**: ご指定通り、スクリプトの場所に移動する処理を追加しました。
# 2. **正規表現の刷新**:
# * `abcd****` の「****」部分を半角英数字4桁 `[a-zA-Z0-9]{4}` に対応させました。
# * その後の連番(`(2)` や `_1` など)があってもなくても一致するように `.*`(任意の文字列)をパターンに組み込みました。
# 3. **画像形式の網羅**: `bmp, jpg, jpeg, png, gif` のすべてを検索対象に含めました。
# 4. **jpg と jpeg の区別**: リクエスト通り、内部処理としてこれらを別扱い(個別の拡張子として判定)するように構成しています。
# ### 📌 改造版:指名手配.py
import os
import re
from pathlib import Path
# ---------------------------------------------------------
# カレントディレクトリをスクリプトのディレクトリに変更
# ---------------------------------------------------------
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir)
print(f"Current directory: {os.getcwd()}")
# ---------------------------------------------------------
# 設定
# ---------------------------------------------------------
SEARCH_DRIVES = ["D"] # 捜査対象ドライブ
LOG_FILE = Path(r"L:\pypy\指名手配\指名手配捜査結果-恐竜.txt")
# ターゲットとなるプレフィックス(接頭辞)
IMAGE_TARGETS = [
"ALLO",
"WEIR",
"WARM",
"TWOF",
"TUOJ",
"TUAT",
"TSIN",
"TRYA",
"TROO",
"TRIL",
"TRIC",
"TRIA",
"TIME",
"TEET",
"TARB",
"TALL",
"TALE",
"STRU",
"STOR",
"STEG",
"STAU",
"SPEE",
"SMAL",
"SITE",
"SHFT",
"SHAN",
"SCEL",
"SAUR",
"SALT",
"RSEA",
"RHOE",
"RHAM",
"RECO",
"RECB",
"RAIR",
"QUET",
"PTEN",
"PTEE",
"PSIT",
"PROT",
"POLA",
"PLES",
"PLAT",
"PLAN",
"PINA",
"PIAT",
"PARK",
"PARA",
"PALE",
"PACH",
"ORNI",
"NODO",
"MYTH",
"MUTT",
"MUSE",
"MURA",
"MOSC",
"MOSA",
"MINM",
"MINE",
"METE",
"MEGA",
"MEAT",
"MDET",
"MASS",
"MAME",
"LONG",
"LESO",
"LEAE",
"KRON",
"KENT",
"INDX",
"IGUA",
"IGNA",
"HYPS",
"HTRO",
"HTHR",
"HSTG",
"HSAU",
"HORN",
"HERR",
"HELP",
"HCER",
"HANK",
"GOBI",
"GLOS",
"GALL",
"FTFB",
"FTFA",
"FOSS",
"FOOT",
"FIND",
"FAMI",
"EXTI",
"EUOP",
"EUDI",
"ERYO",
"ELAS",
"EDET",
"DSOC",
"DRYO",
"DROM",
"DNMU",
"DLAN",
"DIPL",
"DIMO",
"DIME",
"DIET",
"DHUS",
"DEIN",
"DDEF",
"DDEC",
"CYNO",
"CRET",
"COVE",
"COTH",
"CORY",
"COMP",
"CLAW",
"CERA",
"CDAC",
"BRON",
"BRAC",
"BIRT",
"BEFR",
"ANCH",
"AMMO",
"ALLO",
"ALBE",
"AFTR",
]
# 対応する拡張子リスト
# EXTENSIONS = ["bmp", "jpg", "jpeg", "png", "gif"]
EXTENSIONS = ["bmp"]
# ---------------------------------------------------------
# 正規表現パターンの作成
# ---------------------------------------------------------
# パターン解説:
# ^ : 文字列の先頭
# {prefix} : abcd など
# [a-zA-Z0-9]{4} : 半角英数字4桁
# .* : その後の連番など(あってもなくても良い)
# \. : ドット
# {ext}$ : 指定の拡張子で終わる(大文字小文字無視)
def get_patterns():
patterns_dict = {}
for ext in EXTENSIONS:
patterns_list = []
for prefix in IMAGE_TARGETS:
# 【解説】
# ^ : 行頭
# {re.escape(prefix)} : 指定された文字列(SMALなど)と「そのまま」一致(大文字小文字区別あり)
# [a-zA-Z0-9]{4} : 半角英数字4桁
# (?![a-zA-Z0-9]) : その直後に英数字が続かないこと(Recognize対策)
# .* : 連番などの任意の文字列
# \. : ドット
# (?i:{ext})$ : 【ここがポイント】拡張子の部分だけ (?i: ) で囲むことで
# そこだけ大文字小文字を無視(.bmp も .BMP もOK)
pattern = re.compile(
rf"^{re.escape(prefix)}[a-zA-Z0-9]{{4}}(?![a-zA-Z0-9]).*(?i:\.{ext})$"
)
patterns_list.append(pattern)
patterns_dict[ext] = patterns_list
return patterns_dict
EXT_PATTERNS = get_patterns()
# ---------------------------------------------------------
# ログ出力
# ---------------------------------------------------------
def log(message: str):
# ログフォルダがない場合に備えて作成
LOG_FILE.parent.mkdir(parents=True, exist_ok=True)
with LOG_FILE.open("a", encoding="utf-8") as f:
f.write(message + "\n")
print(message)
# ---------------------------------------------------------
# ファイル名がパターンに合致するか判定
# ---------------------------------------------------------
def match_patterns(filename: str, ext: str) -> bool:
patterns = EXT_PATTERNS.get(ext.lower())
if not patterns:
return False
for p in patterns:
if p.match(filename):
return True
return False
# ---------------------------------------------------------
# ドライブ検索
# ---------------------------------------------------------
def search_drive(drive: str):
drive_root = f"{drive}:\\"
found_any = False
if not os.path.exists(drive_root):
log(f"{drive}ドライブは存在しません(アクセス不可)")
return
# os.walkでサブフォルダまで全検索
for root, dirs, files in os.walk(drive_root):
for file in files:
# 拡張子を取得(最後のドット以降)
parts = file.split(".")
if len(parts) < 2:
continue
ext = parts[-1].lower()
if ext in EXT_PATTERNS:
if match_patterns(file, ext):
full_path = os.path.join(root, file)
log(f"[発見] {full_path}")
found_any = True
if not found_any:
log(f"{drive}ドライブには該当ファイルは存在しません")
# ---------------------------------------------------------
# メイン処理
# ---------------------------------------------------------
def main():
log("=== 指名手配ファイル 捜査開始 ===")
for d in SEARCH_DRIVES:
log(f"--- {d} ドライブ捜査開始 ---")
search_drive(d)
log("=== 捜査終了 ===\n")
if __name__ == "__main__":
main()
# ### ✅ チェック内容と改善の解説
# * **正規表現の柔軟性**:
# `abcd1234.bmp` はもちろん、`abcdA1B2_ver2.bmp` や `abcd9999(2).bmp` もヒットするように設計しました。`.*` を入れることで、4桁の後の「おまけ文字列」を不問にしています。
# * **ディレクトリ作成の安全策**:
# `LOG_FILE.parent.mkdir` を追加しました。もし保存先の `L:\pypy\指名手配\` というフォルダ自体が存在しない場合でも、エラーにならずに自動作成されます。
# * **jpg/jpeg の扱い**:
# リスト `EXTENSIONS` に両方入れているため、それぞれ独立してループ処理され、個別にチェックが行われます。
# * **エラー回避**:
# ファイル名にドットが含まれない特殊なファイルがあった場合でもエラーにならないよう、拡張子取得部分に `if len(parts) < 2` のガードを入れました。
# これで、あらゆる画像形式と複雑な連番形式に対応した「指名手配」が可能になります!
# # ==============================
にゃあ ごろ にゃあ
これで
あ こっちにも あった
湧いて出た!
解凍したら・・・(防げん)
ドライブ接続したら・・・(防げん)
まあ
なんだ
きっと!
役に・・・
たてば いいなw
じじぃ~