sirius2wpでWordPressをアクティベートする際にSIRIUSのオリジナルファイルを退避させるところで起きた問題。
shutil.move()で移動させるときに、日本語のファイル名があった場合にCGI側から指定した日本語がサーバー上のファイルシステムまで届かない。
というかPythonではUTF-8の日本語で指定しているけど、ファイルシステム内での文字コードに合わせられないみたいな感じ。
厳密なところはわからないけど、色々調べながら実験して得られた体感。
これは、逆にos.listdir()でファイルリストを取得した場合も、日本語のファイル名をデコードできずにprint()することができなかった、ということからもそう思った。
結局、Pythonの中とファイルシステム内での文字コードの変換ができないとどうにもならないという結論になりかけた。
ちなみにUnicodeにしてみてもダメだった。
ということで一度は諦めたところで、os.fsencode()というのを見つけた。
ファイルシステムの文字コードからエンコードしてくれるらしい。
ということで、os.listdir()で取得したファイル名をos.fsencode()して、それをUTF-8にデコードしてあげると、Pythonで読める日本語になった。
これと、退避するファイル名のリストを突き合わせれば、退避するファイルかどうか判別できるようになる。
1 2 3 4 5 6 |
list = os.listdir('../') for l in list: utf8_l = os.fsencode(l).decode('utf-8') if utf8_l in save_list_utf8: print(f'Move: {utf8_l}<br />') shutil.move(os.path.join('..',l), savedir) |
listdir()で取得したファイル名のutf8_lはPythonが判別できる(UTF-8)もので、lはファイルシステムが判別できるファイル名。
なので、比較(とprint)にはutf8_lを使って、shutil.move()に渡すのはlになる。
os.fsencode()の逆でos.fsdecode()というのもあるのだが、これを使えばPythonからファイル名の指定ができるんじゃないか?とも思って試したけど、どうにもうまくいかない。
出来るのかもしれないけど、自分が思いついて試したやり方ではうまくいかなかかった。