今日はArcGISでプログラムする人なら、誰でも知っているであろうお話。
昨日ふとArcGISで特定のフォルダにあるシェープファイル名をリストしたくなった。というか、する必要があった。
普段ならDOS窓開いて、*.shpと打つのだが、後々の処理を考えて、ここはひとつArcGISの中でPythonを使ってリストしてみようと思った。
ヘルプによれば、ListFeatureClasses()を使えば、シェープファイルのリストができそうである。ArcGISのヘルプにはサンプルのコードも載っているので、それをテキストエディタにコピペして、作業するフォルダだけを変更し、Pythonを動かしてみた。なんだ、Python、けっこうちょちょいのぱー?
ところが、エラーメッセージこそでないものの、シェープファイル名がリストアップされてこない。なぜに?全然ちょちょいのぱーとはいかない。
自慢じゃないが、Pythonのコードなんて私はほとんど書かない。それなのに、たまにプログラミングをしてみると、たいていちゃんと動かない。たまにやるんだから、もっとこう友好的に初心者に優しく動いてくれてもいいのに。なぜ動かないんだろう。
そうか、たまにやるからか。きっとプログラミングは一見さんお断りなのだ。
しかし、いじけていても仕方がない。気を取り直して、別のマシンで同様の操作をして実行してみた。
するとシェープファイル名がリストされてくる。それこそなぜに?余計に疑問が深まる。このマシンは一見さんOKなのか?
よく、ArcMapでレイヤのコピペすると、データソースのパスがうまく認識できないのと同じ現象だろうか。いやいや、フルパスでフォルダを設定しているのに、それはないだろう。
何回かいろんなフォルダのシェープファイルをリストを試みていくと、リストできるときとできないときがある。ということは、やっぱりフォルダの問題なのだろう。
んじゃあということで、arcpy.env.workspaceで設定したワークスペースを、ListEnvironments()でworkspaceに何が設定されているかを確認する。そうしたら、フォルダ名の一部がしかくく文字化けしているではないか。
この文字化けしているのは、findataという名前のフォルダだった。フォルダの区切り文字である¥マークとfの組み合わせで特殊な文字として認識されてしまうらしい。
果たして、Pythonのドキュメントを見てみると、\fとか\aとか\bとかには特別な意味があるらしい。\tだとタブ、\nだと改行を示すのと同じような感じだろうか。
とすると、フォルダ名がfとかaとかbとかで始まらない方がいいということになる。いや、しかし、それじゃあ、あんまりにもArcGISというかPythonが使いにくすぎる。で、よくよく、Pythonのドキュメントを見ると、¥マークを二つ並べるとバックスラッシュになることが判明。
これからは、Pythonでフォルダ名を設定するときは、C:\\home\\data\\findataというように、全部\\で区切ることにする。まったくえんえん。