0
1

pythonでのデータファイルの扱い方

Last updated at Posted at 2024-08-26

はじめに

主に画像認識屋に向けて
pythonでのデータファイルの扱い方を
標準的なデータ形式について知ってしまうためのものです。

json

Python のdict型と対応の付けやすい、キーと値の組合せで読み書きできるデータフォーマットです。
json --- JSON エンコーダーとデコーダー
json フォーマットはCVATでのアノテーション結果の標準的なデータ形式に使われています。
アノテーション結果をの場合には、アノテーションファイルに対応したライブラリを使うのがおすすめです。

yaml

PyYAML
CircleCIのconfig.yaml はyaml形式です。

toml

pypi toml
github toml
python のパッケージ管理用のファイルpyproject.toml はtoml形式です。
python 3.11 以降だとlibtomlが標準ライブラリに追加されています。
tomllib --- TOML ファイルの解析

npy

numpy がデータを保存するデータ形式です。
numpyではIEEEのデータフォーマットで数値データを保存できます。
NaN, PosInf, NegInfなどの値を持つことができます。

numpy.save
numpy.load

pickle

pythonオブジェクトをserialize, deserializeできるモジュールです。
学習済みのclassierのインスタンスをserialize, deserializeすることもできます。
そのため、とても危険です。
また、pythonや使用したモジュールのバージョンの影響を受ける点も厄介です。
scikit-learn それ自体には、学習結果を保存する手段が用意されていません。
そのため学習後のclassifierのインスタンスをpickleしてしまうことがありました。
でも今は、onnxファイルで保存することができます。
scikit-learnで学習した結果をonnxに変換する方法が以下の記事に書かれています。
scikit-learnの学習結果をpickleしない

MATLAB mファイル

MATLABでデータを保存する形式です。
scipyのライブラリで開くことができます。
scipy.io.loadmat
matlabで配列を書き出してPythonで読み込む

CSV ファイル

numpy.loadtxt()
delimiter="," とする。

numpy.save()

pandas でcsvファイル

pandas.read_csv
pandas.DataFrame.to_csv

EXR

高ダイナミックレンジの画像のフォーマット
OpenEXR画像ファイルをpythonで読みこむ

ply

点群データ
表示には
meshmal
Open3D

付記

データ形式の標準化が進んでいるので、以前よりも扱いが楽になってきている。

  • CPUのエンディアンによって影響を受けやすいフォーマットは使われなくなってきている。
  • そのため、X86でもARMでも同じバイナリデータで扱える。

データの永続化の手段

sql のデータベースを読み書きする。

REDIS

REDISでは、SQLのような構造化されたデータではないデータを扱うことができます。

dataclass

Python のdataclassはjson形式でserialize できます。
pypi dataclasses-json

.py
from dataclasses import dataclass
from dataclasses_json import dataclass_json


@dataclass_json
@dataclass
class Person:
    name: str


person = Person(name='lidatong')
person.to_json()  # '{"name": "lidatong"}' <- this is a string
person.to_dict()  # {'name': 'lidatong'} <- this is a dict
Person.from_json('{"name": "lidatong"}')  # Person(1)
Person.from_dict({'name': 'lidatong'})  # Person(1)

# You can also apply _schema validation_ using an alternative API
# This can be useful for "typed" Python code

Person.from_json('{"name": 42}')  # This is ok. 42 is not a `str`, but
                                  # dataclass creation does not validate types
Person.schema().loads('{"name": 42}')  # Error! Raises `ValidationError

上記のpypi にある例題を転載。

データのserialize, desierializeはネットワークインタフェースで、データを転送する際に利用することがあります。
テキストファイルにしてしまえば、OSの違いやCPUのエンディアンの違いを受けません。

Protocol Buffers

Protocol Buffers(プロトコルバッファー)は構造データのシリアライズを目的とした技術スタックである。
github protobuf
pypi protobuf

Protobufの良い点は、複数のコンピュータ言語をサポートしていることです。
送信元と受信先で使用言語を変えることができます。

解説記事の例 pythonの型定義を使ってprotobufを出力してみる。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1