空飛ぶチンアナゴの統計解析日記

統計解析を嗜むチンアナゴのメモ帳です

Q-GISのファイルのパス

pythonスクリプトを書いてcsvのテーブルを読み込ませる時、ドキュメント*1に従って記載すると

csv_path = "file:///作業フォルダーまでのパス/csv_datas/なんかいっぱい入ったテーブル.csv?なんかオプション"
csv_table = QgsVectorLayer(csv_path, "レイヤーの名前", "delimitedtext")

QgsProject.instance().addMapLayer(csv_table)

とのようになる。
で、実際にこのようにコードを記載した時に読み込めないことがあってすごく困った。
ちなみにcsvじゃないshpファイルを読み込む時は

chr_dir = os.getcwd()
file_path = f"{chr_dir}/shp_files/シェープファイル.shp"
shp_file = QgsVectorLayer(file_path, "なんかのマップ", "ogr")

QgsProject.instance().addMapLayer(shp_file)

で問題なく読めたりする。

原因と対策

【原因】ファイルのパスに全角文字が含まれている

これがあるとまず読み込めない。2020年代にもなってまだこんな話があるのかと思ったけど、実際今回の原因がこれだったので仕方ない。
古い時代のQ-GISでは「パスに半角英数字以外が入るとエラーになるので、保存先とファイル名に2バイト文字(日本語とか)が入らないようにしてください*2」と記載があるとはいえ、現在の3系統では概ね「レイヤ>レイヤを追加>CSVテキストレイヤを追加」から選択すれば読み込みができるので、こういう事態が未だに起きることは想定外であった。読み込めなくてもエラーで止まらないし。

【対策】ファイルのパスに関わるところに全角文字を入れない

基本的な方法だけど大事。
ファイル名やフォルダー名は極力半角で名前をつける。
それだけで割と回避できる。

【対策】全角文字のところをバイト列に変換する

実際、「レイヤ>レイヤを追加>CSVテキストレイヤを追加」から読み込んでみると全角文字のところはすべてバイナリー文字列に変換されている。
ということはencode()でバイト列に変換すればと……思うのだけけどこれが上手くいかない。
フォルダーであれば一旦フォルダー内にある何かのファイルを1つ読み込ませて「右クリックプロパティー>プロバイダからの情報>パス」をコピペして改変とかできるけど、複数あるファイルだとなかなかに大変よなとは思う。

結論

Q-GISに使うファイルとパスは2バイト文字は使わない(特にpythonでコードを書く人は)。
なんとも古典的な方法だけど、これ以外あまりうまくいかなさそうなので仕方ないね……。