CSV形式以外でのPythonで扱う構造化されたテキストファイルについて、XMLとJSONについて学びましたが、もう1つここではYAMLファイルについてみていきましょう。
YAMLはJSONと同様にキーと値を持つフォーマットですが、ブロックスタイルで書かれているのでより読みやすい形式だと思います。
また、日付や時刻のデータなど、JSONよりも多くのデータ型を処理することができます。
それでは、YAMLファイルの操作をやってみましょう。
PyYAMLライブラリのインストール
YAMLファイルをPythonで扱うには、ライブラリが必要になります。標準ライブラリには入っていないのでサードパーティのものをインストールしないといけません。
ここではPyYAMLライブラリをインストールしましょう。
Anacondaを使っているならば、おそらくすでにインストールされているかもしれません。そうでないならインストールしましょう。
$ conda install pyyaml
ターミナルからこのコマンドでインストールするか、Anaconda NavigatorのEnviromentsからインストールしましょう。
あるいはpipコマンドでインストールしましょう。
$ pip install pyyaml
Pythonを起動してimport yamlでエラーが出ないならインストールできています。
YAMLファイルの操作
XMLやJSONで使ったデータをYAMLフォーマットで書いてみました。
fruit_1:
name: apple
price: 100
fruit_2:
name: orange
price: 200
コロンでキーと値を区切り、インデントブロックに半角スペース2つを使うのがYAMLの特徴です。
このデータを使ってYAMLファイルの読み込み書き込みを行ってみましょう。
YAMLファイルの書き込み
このデータでYAMLファイルを作成して書き込んでみましょう。
Pythonでファイルを作るにはwithステートメントで開くのがいいですよね。
コードはこんな風にかけます。
import yaml
with open("fruits.yaml", "w") as yf:
yaml.dump({
"fruit_1": {
"name": "apple",
"price": "100"
},
"fruit_2": {
"name": "orange",
"price": "200"
}
}, yf, default_flow_style=False)
yamlパッケージをインポートします。withステートメントで開き、ファイル名をfruits.yamlで指定します。モードはファイルへの書き込みなので”w”です。これをyfとしておきます。
JSONでやった時と同じようにデータの書き込みにはdump()を使います。辞書型であらかじめ用意したデータを変数に入れて与えるか、このコードのように辞書型で直接データを書いていきます。これにyfを指定してファイルを作成します。この時、ここではdefault_flow_style=False も合わせて書いておきます。これは後で説明します。
このコードを実行してみましょう。ファイル名make_yaml.pyとしてAtomで実行しています。
作業ディレクトリにfruits.yamlファイルが作成されます。このファイルを開くと上の右側のようにブロックタイプでデータが記述されているのがわかります。
先ほどの、default_flow_style=False ですが、これをコードに記述しなくてもファイルは作成されます。ただし、次のように辞書型で作られます。
これもYAMLファイルなのですが、先ほどのブロック形式で表示の方が読みやすいですし、ブロック形式の方がよく使われるので、default_flow_style=False はコードに入れましょう。
YAMLファイルの読み込み
今度はこの作成したYAMLファイルのデータを読み込んでprint出力してみましょう。
同じようにwithステートメントを使ってコードを書いてみます。
import yaml
with open("fruits.yaml", "r") as yf:
data = yaml.load(yf)
print(data)
print("-" * 30)
print(data['fruit_1']['name'], ':', data['fruit_1']['price'])
print(data['fruit_2']['name'], ':', data['fruit_2']['price'])
ファイルの書き込みと同様にwithステートメントを使いますが、こちらは読み込みなのでモードは”r”です。load()でファイルyfを読み込み、変数dataに入れてprintで出力しています。
実行してみましょう。
辞書型で出力されているのがわかります。アンダーバーで区切りを入れて、辞書型のキーを指定して値のみを再度出力しているのがわかります。
load()に注意
ここではload()を使ってファイルを読み込みましたが、次のようにsafe_load()を必ず使うべきだとされています。
import yaml
with open("fruits.yaml", "r") as yf:
data = yaml.safe_load(yf) # safe_load()を使う
print(data)
このコードの実行結果は同じです。
保護されていないYAMLのロードでRuby on Railsでセキュリティ上の問題がかつて発生したそうです。止むを得ない場合をのぞいて、safe_load()を必ず使うことにしましょう。
まとめ
YAMLはJSONと同様のキーと値を持つフォーマットのデータです。日付や時刻のデータなど、JSONよりも多くのデータ型を処理することがでます。
PythonでYAMLを扱うには、サードパーティのPyYAMLライブラリのインストールが必要になります。
YAMLファイルは辞書型ですが、ブロック型で書かれることも多く、インデントは半角スペース2文字分です。
YAMLファイルの読み込み書き込みには、dump()、load()を使いますが、読み込みのload()はセキュリテイ上問題が発生することもあることから、safe_load()を必ず使うようにしましょう。