↓ メインコンテンツへスキップ
  1. 補講/
  2. 補講01講 応用 Python プログラム/

テキストファイルフォーマット

ファイルフォーマット
#

プログラムを書いていると、テキスト形式の様々なフォーマットに出会います。 その中でも、よく使われるファイルフォーマットを紹介します。

CSV
#

CSV (シーエスブイ; Comma Separated Values) は、データをカンマで区切って記述するファイルフォーマットです。 Excel などの表計算ソフトでよく使われます。 コンマの代わりにタブを使う場合もあり、この場合は、TSV (Tab Separated Values) と呼ばれることもあります。 何かの文字で区切ったデータのことをCSVと総称することもあります。

CSV ではコメントは書けません。またデータの中に区切り文字(,)が含まれる場合はそのデータをダブルクォーテーション(")で囲みます。 ダブルクォートで囲まれた文字列の中には改行を含むこともできます。 データにダブルクォートが含まれる場合は、連続する2つのダブルクォートでエスケープします。 つまり、"" は単なる文字としての " として扱われます。

これらのことから、csv のデータを読み込み、line.split(",") としても、区切り文字が含まれるデータは正しく分割されないことに注意してください。 そのため、CSVを扱うには、専用のモジュールの利用を推奨します。

CSV の例
#

1行目はヘッダとして扱われる場合もある,aaa,bbb,ccc
1,2,3,4
5,6,7,8
"9,10","11,12","13,14","15,16"

JSON
#

JSON (ジェイソン; Java Script Object Notation) は、JavaScript のオブジェクト表記法をベースにしたデータ交換フォーマットです。

JSON は、データをキーと値のペアで表現します。 キーは文字列で、値は文字列、数値、真偽値、配列、オブジェクトのいずれかです。 オブジェクトは {} で囲み、キーと値は : で区切ります。 配列は [] で囲み、要素は , で区切ります。

JSON はコメントを書くことができません。 JSON をコメントを書けるよう拡張した言語もありますが、JSON としては正しくありません。

JSON の例
#

{
    "key1": "value1",
    "key2": 2,
    "key3": true,
    "key4": [1, 2, 3],
    "key5": {
        "key6": "value6",
        "key7": 7
    }
}

YAML
#

YAML (ヤムル; YAML Ain’t Markup Language) は、人間にとって読みやすいデータフォーマットです。 JSON は機械にとって扱いやすいですが、人間にとっては扱いにくいことがあります。 キーが文字列であるため、" で囲む必要があることや、 , で区切る必要があることがその理由です。 YAML は上記のようなJSONの問題点を解決し、人間にとって読みやすいフォーマットのため、開発されたものです。

YAML は、インデントで階層を表現します。 インデントはスペース2つかスペース4つが一般的です。 YAML はコメントを書くことができ、# で始まり、行末までがコメントとして扱われます。

他にも JSON の拡張として、TOML (トムル; Tom’s Obvious, Minimal Language) がありますが説明は省略します。

  • PyYAML: Python で YAML を扱うためのライブラリ。

YAML の例
#

以下のYAMLの例は JSON の例と同じデータを表しています。

key1: value1
key2: 2
key3: true
key4:
  - 1
  - 2
  - 3
key5:
    key6: value6
    key7: 7

Pkl
#

Pkl (ピクル) は、比較的新しく 2024年に Apple が開発した設定ファイルのためのデータフォーマットです。 上記の JSON や YAML、TOML など様々な形式のデータフォーマットがあり、 各言語、ツールごとに受け入れられるフォーマットが異なります。 各フォーマットを相互変換するツールもありますが、その際にデータの損失が発生することがあります。 Pkl はそのような現状を踏まえ、Pkl から他のフォーマットへの変換が容易であることを特徴としています。

なお、Python のモジュールに pickle という Python オブジェクトの serialize/deserialize ライブラリがありますが、 pkl と pickle は異なるものです。

Pkl の例
#

key1 = "value1"
key2 = 2
key3 = true
key4 = [1, 2, 3]
key5 = new {
    key6 = "value6"
    key7 = 7
}

Markdown
#

Markdown (マークダウン) は、構造化された文書を記述するための軽量マークアップ言語です。 HTML や \(\LaTeX\) と違い、テキスト形式のまま閲覧しても(catなどで見ても)構造化されて、そのまま読めるようになっています。

Markdown は、HTML に変換することができます。 このプログラミング演習Bの資料も Markdown で記述されています。 GitHub などで公開する文書(README.md)を Markdown 形式で書いておくと、そのプロジェクトのトップページを閲覧したときに HTML に変換されたものが閲覧できます。 Qiita や Zenn などのブログサービスでも Markdown で記事を書くことができます。 その他、多くの SSG (Static Site Generator) が Markdown をサポートしています。

Markdown の例
#

# 見出し1

ここは地の文です。
単なる改行は無視され、一つの段落として扱われます。
空行を開けると、段落の区切りとみなされます。
なお、見出しや箇条書きの前後には空行を開けることが推奨されています。

- これは箇条書きになります。
  - 箇条書きの箇条書きもOK。
- これも箇条書きです。

データフォーマットの検証
#

これからプログラムを書いていくうちに、これらのデータフォーマットを利用することもあるでしょう。 そのようなとき、lint(リント)というツールを使って、フォーマットのチェックを行うよう心がけましょう。 lint は、フォーマットをチェックするツールで、間違っている箇所を教えてくれます。 自分でフォーマットを書くことも多いですが、どのフォーマットも手作業だとミスが発生しやすいです。 プログラムの間違いと思っていたら、データファイルのフォーマットのミスだったということもあります。

利用したい場合は、csv lint のように、フォーマット名+lint で検索してみましょう。 Web上のサービスもあります。

相互変換
#

これらのフォーマットを相互変換したいという場合もあり、ツールはいくつかあります。

  • pandoc
    • ドキュメントのフォーマットを相互変換するツールです。ただ、必ずしも成功するわけでもないようです。
    • プログラミング演習Aの資料は、Markdown から HTML に変換する際に pandoc を利用しています。
  • DevToys
    • 開発にまつわる種々の細かい機能を盛り込んだ GUI アプリケーションです。
    • フォーマットの変換も行えます。
  • その他Web上の変換ツール
    • JSON to YAML などで検索すると Web 上で変換できるツールが見つかります。そのようなものを利用しても良いでしょう。 

まとめ
#

  • CSV (Comma Separated Values)
    • コンマで区切って一行に1エントリを記述するフォーマットのこと。
    • 拡張子は .csv が一般的である。
    • コメントは書けない。
    • 1行目はヘッダとして扱われることがある(ヘッダがない場合もある)。
    • タブなど、他の文字でで区切る場合もある(タブで区切るとTSV; Tab Separated Valuesと呼ばれることもある)。
  • JSON (Java Script Object Notation)
    • JavaScript のオブジェクト表記法をベースにしたデータ交換フォーマットのこと。
    • 拡張子は .json が一般的である。
    • コメントは書けない。
  • YAML (YAML Ain’t Markup Language)
    • 人間にとって読みやすいことを目指したデータフォーマットのこと。
    • 拡張子は .yaml や .yml が一般的である。
      • インデントで階層を表現する。
    • # から始まり、行末までがコメントとして扱われれる。
  • Pkl (Apple Pkl Language)
    • Apple が開発した設定ファイルのためのデータフォーマットのこと。
    • 拡張子は .pkl が一般的である。
    • JSON や YAML などのデータフォーマットへの変換が容易である。
  • Markdown
    • 構造化された文書を記述するための軽量マークアップ言語のこと。
    • 拡張子は .md が一般的である。
    • HTML に変換することができる。
      • GitHub や Qiita、Zenn などで利用されている。
  • フォーマットの検証
    • 各フォーマットごとにlintというプログラムが存在する。 lintプログラムを利用することでフォーマットが正しいかを検証できるようになる。
  • 相互変換
    • フォーマットを相互変換するツールがいくつか存在する。
      • pandoc や DevToys など。
      • Web上の変換ツールもある。