はじめに
Pythonでどこかからとってきた文字列で自動的にフォルダを作成していると、winwowsで使用できないフォルダ名になってしまって、消すのがとても大変になることがあります。
そこでwindowsのディレクトリ名に使えるように名前を変更するプログラムを紹介します。

変更する文字
半角文字
まず、windowsのフォルダで使用できない文字があります。それが以下の文字です。
\ / : * ? " < > |
そのため、以下の全角文字に変更します。
¥ / : * ? ” < > |
エスケープシーケンス
上の使用できない半角文字の中に\がありましたが、これだけを置き換えると、エスケープシーケンスとしてとらえておらず、おかしくなってしまいます。
例えば、皆さん\nこんにちはを変換すると皆さん¥nこんにちはというようになってしまします。
しかし、本当にしたいのは、\nを削除した皆さんこんにちはです。
そこで、エスケープシーケンスを削除します。なお、これは半角文字を置き換える前にやらないといけません。
具体的には、エスケープシーケンスには、以下のものがあります。
| 記号 | 意味 |
|---|---|
| \a | ベル文字(アラート) |
| \b | 1文字分戻る |
| \f | ページ送り(クリア) |
| \n | 改行、復帰 |
| \r | 同じ行の先頭に戻る |
| \t | 水平タブ |
| \v | 垂直タブ |
\\ |
\を表示 |
| ? | ?を表示 |
| ' | シングルクォーテーション(')を表示 |
| " | ダブルクォーテーション(")を表示 |
| \0 | ヌル |
| \N | 8進定数(Nは8進数の定数) |
| \xN | 16進定数(Nは16進数の定数) |
これをすべて削除、もしくは置き換えます。
なお、\Nと\xNは変換は諦めます。
\?に関しても、ほかのサイトなどを見るとエスケープシーケンスとして処理されていなさそうなので無視します。
また、誰かがよく知らずにバックスラッシュを使用しているとどうしようもないことがあります。例えば、ここに\appleがありますという文字列は\aが認識されて削除されてしまいます。
先頭/末尾のドット/空白
先頭/末尾にドット/空白があると、ファイル削除すらできない大変なフォルダができてしまいます。
というのも多くのアプリケーションによって
「C:\hoge」(末尾にスペースやピリオドがない、ごく普通のフォルダ)
「C:\hoge.」(末尾にピリオドがあるフォルダ)
「C:\hoge 」(末尾にスペースがあるフォルダ)
なんと、この3つが同じものとして扱われ、不定な名称となります。
そのため削除します。
strip関数を使用して削除すると、先頭/末尾の__1文字__しか削除できないので、while Trueでなくなるまで回します。
プログラム
def rename_for_windows(name):
while True:
tmp = name
#半角文字の削除
name = name.translate((str.maketrans({'\a':'','\b':'','\f':'','\n':'','\r':'','\t':'','\v':'',"\'":"'",'\"':'"','\0':''})))
#エスケープシーケンスを削除
name = name.translate((str.maketrans({'\\':'¥','/': '/' , ':': ':', '*': '*', '?': '?', '"': "”", '>': '>', '<': '<', '|': '|'})))
#先頭/末尾のドットの削除
name = name.strip(".")
#先頭/末尾の半角スペースを削除
name = name.strip(" ")
#先頭/末尾の全角スペースを削除
name = name.strip(" ")
if name == tmp:
break
return name
間違えて作成した消せないフォルダの削除の仕方
ちなみに、間違えて作ってしまった消せないフォルダの削除の仕方は以下のページに書いてあります。
Microsoft 名前の最後にドットが入った消せないフォルダができてしまいました。
まとめ
文字列をwindowsでフォルダ名に使える文字列に変換するPythonプログラムを紹介しました。
私自身、スクレイピング時に自動的にフォルダを作っているのですが、この時にフォルダ作成前にこのプログラムを挟むようにしています。
同じことができるライブラリがあればいいのですが...
是非皆さん使って似てください。
参考