ファイルをWindowsの古いツールで読み込もうとすると、たまに読めないことがあります。
「まあ、いいか」と思って何年か放置してましたが、ふと調べてみたところ、Macで作ったファイルが読めていないことがわかりました。
原因はファイル名にあり、UnicodeのNFD/NFCの違いや、読み込めない特殊記号のせいでした。
それを変換するツールがあればいいのですが、ないようなのでPythonでプログラムを作りました。(※主にGPT4が)
今回の仕様では、ディレクトリ配下のファイルをすべて正規化します。
あまり動作確認していないので、実行するときは念のためバックアップを取ってください。
せっかくなのでコードを公開します。Pythonを実行する方法がわかる人は使ってみてください。
わからない人向けには記事を書いているので次を参考にしてください。
【まとめ】このサイトのPython記事【プログラミング】
言語や環境設定、スクレイピングの入門記事があります。 学習の準備やその他のプログラミングは次で説明しています。 AIの活用で解決 チャットAIを使いこなせば、精度の高…
目次(読みたいところから読めます)
コードと動作環境
動作環境
Python 3.11.5
Windows11
# タイトル:Win用ファイル名正規化プログラム
# 機能:Unicodeの正規化や特殊文字の削除により、
# Macで作成したファイルをWinの古いツールでも読めるようにする
# 仕様:dir_pathフォルダ配下の全ファイルを正規
# 使用方法:dir_pathにディレクトリまでのパスを自分でコピペしてプログラムを実行
# 作成日:240815
# 動作環境:Python 3.11.5, Windows11
# 作者:テル
import os
import unicodedata
import re
# 対象ディレクトリのパスを指定
dir_path = r'ここにディレクトリまでのパスをコピペ(例:C:\dat\file_list)'
# 削除したいWindowsで読み込めない記号を指定
invalid_chars_pattern = re.compile(r'[^\w\s.-]')
def clean_filename(filename):
# ファイル名をNFCに正規化
normalized_filename = unicodedata.normalize("NFC", filename)
# 正規表現でWindowsで読み込めない記号を削除
cleaned_filename = re.sub(invalid_chars_pattern, '', normalized_filename)
return cleaned_filename
# ディレクトリ配下の全ファイルを再帰的に処理
for root, dirs, files in os.walk(dir_path):
for file in files:
# ファイル名をクリーニング
cleaned_file_name = clean_filename(file)
# 現在のファイルパス
old_path = os.path.join(root, file)
# 新しいファイルパス
new_path = os.path.join(root, cleaned_file_name)
# ファイル名が変更される場合のみリネーム
if old_path != new_path:
os.rename(old_path, new_path)
print(f'Renamed: {old_path} -> {new_path}')
せっかく作ったんだけど、新しいアプリは、この問題にだいたい対応してるから、あんまり出番はないかもね。
実行方法(環境構築)
Pythonの実行方法は、ゼロからだと時間はかかりますが、それほど難しくありません。
次の記事を参考にすれば、誰でもできるのではないでしょうか。
コメント