先日、OpenCVを試していた際に気が付いたのですが、OpenCVで処理を
行う画像ファイルのファイルパスは2バイト文字(全角)はNGっぽいです。
これにナカナカ気が付かずに戸惑いました。
過去にも2バイト文字NGとなる経験がありました。最初の頃は諦めていた
のですが、慣れてくると"ファイルを読み込む直前にリネームし、読み込み後
元の名前に戻せば良いんじゃない?"とか思い付き対応出来ていました。
しかし今回2バイト文字が含まれていたのは、ファイル名では無くフォルダ名
でした。
ちょっと話はそれますが、2バイト文字を利用しているのはアジア圏の
言語が多いです。(Copilotで調べました・・・)
世界の人口の60%はアジア人です。(Copilotで調べる前は3/4だと思ってました)
2バイト文字未対応のソフトウェア/ライブラリ/モジュールは60%もの
ユーザーを対象外としているので損だと思うのですけどね・・・。
(アジア圏でも1バイト文字で足りる言語もあると思うので、極論です)
で、フォルダ名のリネームは抵抗がある為、2バイト文字未使用の
ファイルパスとなる所にファイルをコピーし、コピーしたファイルを
読ませる事でエラーを回避する事にしました。
pythonの場合、この"一時的なフォルダの作成"に便利なモジュール
"tempfile"があります。標準モジュールなので本当に助かります。
検索で調べつつこんな感じで試しました。
# pythonimport tempfile import pathlib defmain(): with tempfile.TemporaryDirectory() as td: print(f"{td} : {pathlib.Path(td).exists()}") print(f"{td} : {pathlib.Path(td).exists()}") if __name__ == '__main__': main()
実行結果はこんな感じです。
C:\Users\<ユーザー名>\AppData\Local\Temp\tmp4tnxeewh : True C:\Users\<ユーザー名>\AppData\Local\Temp\tmp4tnxeewh : False
with文を抜けると一時的なフォルダが削除されます。便利です!!
ん?ちょっと待て。2バイト文字が含まれているのは<ユーザー名>
なんです。これじゃ意味ないじゃない・・・。
色々と検索しましたが、TemporaryDirectoryメソッドで指定した
フォルダ内に一時的なフォルダを作るようなサンプルが見当たりません。
結局、分かりにくいなと思いつつ公式のドキュメントへ
tempfile --- Generate temporary files and directories — Python 3.12.3 ドキュメント
パラメータ"dir"で指定するとそのフォルダ内に一時フォルダを
作ってくれそうなので、この様に修正しました。
・・・ defmain(): with tempfile.TemporaryDirectory(dir = "c:/") as td: print(f"{td} : {pathlib.Path(td).exists()}") ・・・
結果はこんな感じです。
c:/tmpeyrdezt7 : True c:/tmpeyrdezt7 : False
処理中に例外が発生しても、勝手に削除してくれるようです。
tempfileモジュールの便利さを例えるのであれば、ハイテク便座で
立ち上がると勝手に流れるようなイメージでしょうか?
我が家は機能を止めているのですが、あれって健康診断等の検○の際に
機能を止め忘れ立ち上がってしまうと、途中で止められないし、
手でつかみ取るわけにもいかないし・・・ただ見守るしかないので
しょう。 あぁあれをWの悲劇と呼ぶのか。(トイレ=WC)