QGISのpythonコンソールでCSVファイルを読み込む方法。
この記事では、QGISのpythonコンソールでCSVファイルの読み込む方法を紹介したいと思います。
pythonコンソールの場所や使い方についてはこちらの記事で紹介しています。
pythonを使ってCSVファイルの読み込みを行う。
では、早速pythonを使ってQGIS上にCSVファイルの読み込みを行ってみましょう。
まずは、作業をしやすいようにテキストエディタを立ち上げるとよいと思います。
エディタの場所は以下になります。押すテキストエディタが立ち上がります。
1つのCSVファイルを読み込む
テキストエディタに以下のコードを入力するとCSVファイルを読み込むことができます。
ファイルの場所やファイル名、X座標とするフィールド、Y座標とするフィールド、座標値の座標系などデータに合わせて変更してください。
読み込むCSVファイル、対象とするX座標とY座標の属性フィールド名に2バイト文字(全角文字)が入っているとエラーになります。
#必要なモジュールをインポート
import os
from qgis.core import QgsProject, QgsVectorLayer
#csvファイルのファイル名を入力
datamei = r"C:\python\20240218.csv"
#レイヤー名をファイル名にする変数を定義
csvmei = os.path.splitext(os.path.basename(datamei))[0]
#csvファイルの定義を変数に代入
csvdata = 'file:///' + datamei +'?delimiter= {}&crs=epsg:6677&xField={}&yField={}'.format(',','X','Y')
#読み込み
csvlayer = QgsVectorLayer(csvdata, csvmei , 'delimitedtext')
#レイヤに追加
QgsProject.instance().addMapLayer(csvlayer)
なかなか全角文字(2バイト文字)を受け付けないのは曲者ですね。ということで、強引に、別名でCSVファイルを作成して、属性フィールド名を変えるバージョンを書いてみました。
pythonの「pandas」というライブラリを使用して処理を行っているので、事前にcmd(コマンドブロンプト)に以下のコードを入力して、ライブラリをインストールする必要があります。cmd(コマンドブロンプト)の開き方は以下の記事を見てみてください。開いたらそのままこのコードを入力したいただければ大丈夫です。
pip install pandas
処理するコードはこんな感じです。
#必要なモジュールをインポート
import os
from qgis.core import QgsProject, QgsVectorLayer
import pandas as pd
#csvファイルのあるフォルダのURLを入力
workfolder = r"C:\python\\"
#csvファイルのファイル名を入力
datamei = r"20240218 - コピー.csv"
#ファイルのURL変数
dataurl = workfolder + datamei
df = pd.read_csv(dataurl)
#日本語等2バイト文字はエラーとなるため、フィールドのxyのところをXyomi、Yyomiというフィールド名にする
x = 'X'
y = 'Y'
df.rename(columns={x : "Xyomi", y : "Yyomi"}, inplace=True)
#レイヤー名をファイル名にする変数を定義
csvmei = os.path.splitext(os.path.basename(dataurl))[0]
#XとYのフィールド名を変更したcsvファイルを1_XYre.csvに変更して同じフォルダに保存
df.to_csv(workfolder + r'1_XYre.csv')
csv_shp = workfolder + r'1_XYre.csv'
#csvファイルの定義を変数に代入
csvdata = 'file:///' + csv_shp +'?delimiter= {}&crs=epsg:6677&xField={}&yField={}'.format(',','Xyomi','Yyomi')
#読み込み
csvlayer = QgsVectorLayer(csvdata, csvmei , 'delimitedtext')
#レイヤに追加
QgsProject.instance().addMapLayer(csvlayer)
全角文字(2バイト文字)に対応してくれれば楽なのですがしていないのでこういう処理を行いました。
QGISというわけではないのですが、「pyshp」というライブラリは全角文字(2バイト文字)も対応しているようなので、こちらの方が処理が楽なのかもしれません。
いくつかのCSVファイルを読み込む
いくつかのデータを読み込む場合は色々方法はあると思います。
この記事ではglobでリストを取得しfor文で処理を行って、CSVファイルを追加します。
#必要なモジュールをインポート
import os
from qgis.core import QgsProject, QgsVectorLayer
import glob
#読み込むファイルのURLを指定し変数に定義[リスト]
csv_list = glob.glob(r"C:\python\csv\\" + "*.csv")
#リスト内のデータに関して以下のコードを実行
for csv_1 in csv_list:
#レイヤー名をファイル名にする変数を定義
csv_layer = os.path.splitext(os.path.basename(csv_1))[0]
#csvファイルの定義を変数に代入
csvdata = 'file:///' + csv_1 +'?delimiter= {}&crs=epsg:6677&xField={}&yField={}'.format(',','X','Y')
#読み込み
csvlayer = QgsVectorLayer(csvdata, csv_layer , 'delimitedtext')
#CSVファイルをポイントレイヤーとして追加
QgsProject.instance().addMapLayer(csvlayer)
ファイル名と、属性フィールド値に全角文字(2バイト文字)があったとき用の処理
#必要なモジュールをインポート
import os
from qgis.core import QgsProject, QgsVectorLayer
import pandas as pd
#読み込むファイルのURLを指定し変数に定義[リスト]
csv_list = glob.glob(r"C:\python\csv\\" + "*.csv")
#リスト内のデータに関して以下のコードを実行
for csv_1 in csv_list:
#レイヤー名をファイル名にする変数を定義
csv_layer = os.path.splitext(os.path.basename(csv_1))[0]
dir_n = os.path.dirname(csv_1)
print(dir_n)
#csvファイルを読み込む
df = pd.read_csv(csv_1)
#日本語等2バイト文字はエラーとなるため、フィールドのxyのところをXyomi、Yyomiというフィールド名にする
x = 'X'
y = 'Y'
df.rename(columns={x : "Xyomi", y : "Yyomi"}, inplace=True)
#XとYのフィールド名を変更したcsvファイルを1_XYre.csvに変更して同じフォルダに保存
df.to_csv(dir_n + "\\" + r'1_XYre.csv')
csv_shp = dir_n + "\\" + r'\\1_XYre.csv'
#csvファイルの定義を変数に代入
csvdata = 'file:///' + csv_shp +'?delimiter= {}&crs=epsg:6677&xField={}&yField={}'.format(',','Xyomi','Yyomi')
#読み込み
csvlayer = QgsVectorLayer(csvdata, csv_layer , 'delimitedtext')
#レイヤに追加
QgsProject.instance().addMapLayer(csvlayer)
最後にまとめ
この記事では、pythonコンソールを使用したCSVファイルの読み込みを紹介しました。全角文字(2バイト文字)がないファイルだとスムーズだと思いますが、ファイル名や、座標として読み込むデータ名に全角文字(2バイト文字)があるとエラーになってしまうで困ることがあると思うので参考にしていただければと思います。
- CSVファイル、対象とするX座標とY座標の属性フィールド名に全角文字(2バイト文字)が入っているとエラーになる。