Island Babies

いろんなことを書きます

os.path.exists で存在するはずのパスがFalseを返す

概要

タイトル通りですが、最近画像のデータセットについて、コピーするのではなくてシンボリックリンクを貼れば良いのでは?ということで元のデータセットからいい感じにデータをまとめるスクリプトを書いていたのですが、そこで起きたエラーが少しややこしかったという感じです.
具体的には、dataset_hogehoge/images,xmls という感じのディレクトリから対応する画像をシンボリックリンクで、xmlをコピーでそれぞれ新しいディレクトリに持ってくるということをしている時、一応コピーしてきた xml 中に書かれているファイル名の画像がちゃんと入っているかな?ということを確認するスクリプトを書いてみたところ・・・

なぜ

ほぼ全てのxml ファイルに対応する画像ファイルについて、os.path.exists が false を返すことがわかりました。なるほどなるほど、ファイル名を間違えていたのか、うっかりさんめ・・・と思ったのですが一応確認しておこうと思って ls hogehoge.png とかやってみると、ファイル自体は存在していることがわかりました.
・・・?
この時点で?が頭の上に3個くらい浮かびまして、色々調べていると次のようなページが見つかりました.

stackoverflow.com

なるほどー、空白記号とかが入っているといかんのだな、ということで.strip() して再度試してみましたが、うまくいかず・・・
その後も色々探してみると、ついに発見しました。

http://python.6.x6.nabble.com/os-path-exists-path-returns-false-when-the-path-actually-exists-td1701865.html

Return True if path refers to an existing path. Returns False for broken symbolic links. On some platforms, this function may return False if permission is not granted to execute os.stat() on the requested file, even if the path physically exists.

So the better question is, does is this file a broken symbolic link or can os.stat() be executed on it?

どうやらシンボリックリンクが綺麗に貼れていない場合、見かけ上はファイルがあるけど実体がない?ためにエラーが返されるようです。 シンボリックリンクを貼るコードをよくよく読んでいると、画像名の拡張子をつけるところで間違えていたことを発見しました! これで一件落着。 しかしファイルが存在しなくてもシンボリックリンクを貼る時点では特にエラーが出ないとは・・・なかなか難しいですな