"""
概要: データファイル操作のためのクラスとユーティリティを提供します。
詳細説明: このモジュールは、構造化されたデータファイル(ラベルとデータリストの形式)を読み込み、検索、操作するための
`tkDataFile`クラスを提供します。ファイルからデータを効率的に抽出し、管理するための機能が含まれています。
関連リンク: :doc:`tkdatafile_usage`
"""
import csv
import re
from tklib.tkutils import pint, sort_lists
from tklib.tkfile import tkFile
from tklib.tkinifile import tkIniFile
import tklib.tkre as tkre
[ドキュメント]
class tkDataFile(tkFile):
"""
概要: ラベルとデータリストを持つデータファイルを扱うためのクラス。
詳細説明: `tkFile`を継承し、データファイルの読み込み、ラベルの検索、データ配列の取得などの機能を提供します。
主に、行がデータアイテム、列がその属性に対応するような表形式のデータを扱います。
"""
def __init__(self, path = None, mode = 'r', OpenFile = True, **args):
"""
概要: `tkDataFile` クラスの新しいインスタンスを初期化します。
詳細説明: 親クラス`tkFile`のコンストラクタを呼び出し、`labelarray`(データラベルのリスト)と
`datalistarray`(各ラベルに対応するデータリストのリスト)を初期化します。
:param path: str, optional: 開くファイルのパス。デフォルトは `None`。
:param mode: str, optional: ファイルを開くモード (例: 'r', 'w')。デフォルトは 'r'。
:param OpenFile: bool, optional: コンストラクタでファイルを開くかどうか。デフォルトは `True`。
:param **args: `tkFile`に渡される追加のキーワード引数。
"""
super().__init__(path = path, mode = mode, OpenFile = OpenFile, **args)
# super(tkIniFile, self).__init__(path, mode, OpenFile, **args)
self.labelarray = []
self.datalistarray = []
def __del__(self):
"""
概要: `tkDataFile` インスタンスが破棄されるときにファイルを閉じます。
"""
self.Close()
super(tkIniFile, self).__del__()
def __str__(self):
"""
概要: オブジェクトの文字列表現を返します。
:returns: str: オブジェクトのクラスパス。
"""
return self.ClassPath()
[ドキュメント]
def GetArrayData(self, idx):
"""
概要: (未実装) 指定されたインデックスの配列データを取得します。
詳細説明: 現在このメソッドは実装されておらず、`pass`のみが含まれています。
:param idx: int: 取得するデータのインデックス。
"""
pass
[ドキュメント]
def GetHashData(self):
"""
概要: (未実装) データからハッシュマップを取得します。
詳細説明: 現在このメソッドは実装されておらず、`pass`のみが含まれています。
"""
pass
[ドキュメント]
def sort(self, lists):
"""
概要: 複数のリストを一緒にソートします。
詳細説明: `tklib.tkutils.sort_lists` 関数を呼び出して、提供されたリストをソートします。
主に、関連する複数のデータリストを同じ基準で並べ替える際に使用されます。
:param lists: list[list]: ソートするリストのリスト。
:returns: list[list]: ソートされたリストのリスト。
"""
return sort_lists(lists)
[ドキュメント]
def find_label_index(self, regexp, flag = None, flags = ''):
"""
概要: 指定された正規表現またはインデックスに一致するラベルのインデックスを見つけます。
詳細説明: `labelarray`内のラベルを検索し、一致するもののインデックスを返します。
正規表現、数値インデックス、または文字列として解釈可能な数値を受け入れます。
大文字小文字の区別を無視するオプション ('i' フラグ) や、スペース、括弧を削除して比較するロジックも含まれます。
:param regexp: str or int: 検索する正規表現、またはラベルのインデックス。
:param flag: str or None, optional: 互換性のためのフラグ ('i' は大文字小文字無視)。`flags`引数に優先されます。
:param flags: str, optional: 検索フラグ ('i' は大文字小文字無視)。デフォルトは `''`。
:returns: int or None: 見つかったラベルのインデックス。見つからなかった場合は `None`。
"""
if flags == '' and flag is not None:
flags = flag
# print("labels=", self.labelarray)
# print("reg=", regexp)
if type(regexp) is int:
return regexp
else:
idx = pint(regexp, None)
if idx is not None:
return int(regexp)
if flags == 'i':
flags = re.IGNORECASE
regexp_nosp = re.sub(r'[\[\(]', '(', regexp, flags = flags)
regexp_nosp = re.sub(r'[\]\)]', ')', regexp_nosp, flags = flags)
regexp_nosp = re.sub(r'\s', '', regexp_nosp, flags = flags)
for i in range(len(self.labelarray)):
# print(" i=", i, regexp, self.labelarray[i])
if regexp == self.labelarray[i]:
return i
s_nosp = re.sub(r'[\[\(]', '(', self.labelarray[i])
s_nosp = re.sub(r'[\]\)]', ')', s_nosp)
s_nosp = re.sub(r'\s', '', s_nosp)
if regexp_nosp == s_nosp:
return i
if tkre.Search(regexp, self.labelarray[i], flag):
return i
return None
[ドキュメント]
def find_data_array(self, regexp, flag = None, flags = '', convert_type = None, def_val = None, ):
"""
概要: 指定された正規表現またはインデックスに一致するラベルとデータ配列を見つけます。
詳細説明: `find_label_index`を使用してラベルのインデックスを特定し、そのインデックスに対応する
ラベルとデータ配列を返します。必要に応じてデータ配列の要素を指定された型に変換します。
例えば、文字列の数値データを整数や浮動小数点数に変換できます。
:param regexp: str or int: 検索する正規表現、またはラベルのインデックス。
:param flag: str or None, optional: 互換性のためのフラグ ('i' は大文字小文字無視)。`flags`引数に優先されます。
:param flags: str, optional: 検索フラグ ('i' は大文字小文字無視)。デフォルトは `''`。
:param convert_type: type or None, optional: データ配列の要素を変換する型 (例: `int`, `float`)。デフォルトは `None`。
:param def_val: any, optional: 変換に失敗した場合に使用するデフォルト値。
:returns: tuple[str or None, list or None]: 見つかったラベルとデータ配列のタプル。
見つからなかった場合は `(None, None)`。
`convert_type`が指定されている場合は、変換されたデータ配列が返されます。
"""
# print("regexp=", regexp)
# print("labels=", self.labelarray)
# print("data=", self.datalistarray)
# print("regexp=", regexp)
if type(regexp) is int:
idx = regexp
else:
idx = pint(regexp, defval = None)
if idx is None:
idx = self.find_label_index(regexp = regexp, flag = flag, flags = flags)
if idx is None or len(self.labelarray) <= idx: # インデックスが見つからないか範囲外の場合
return None, None
if convert_type is None:
return self.labelarray[idx], self.datalistarray[idx]
else:
data = self.datalistarray[idx].copy()
for i in range(len(data)):
if convert_type is float:
# pfloatはtklib.tkutilsからはインポートされていないが、既存のロジック変更禁止のためそのまま
data[i] = pfloat(data[i], data[i])
elif convert_type is int:
data[i] = pint(data[i], data[i])
return self.labelarray[idx], data
[ドキュメント]
def FindLabelIndex(self, regexp, flag = None, flags = ''):
"""
概要: `find_label_index`のラッパー。
詳細説明: `find_label_index`メソッドと同じ機能を提供し、後方互換性または異なる命名規則のために使用されます。
:param regexp: str or int: 検索する正規表現、またはラベルのインデックス。
:param flag: str or None, optional: 互換性のためのフラグ ('i' は大文字小文字無視)。`flags`引数に優先されます。
:param flags: str, optional: 検索フラグ ('i' は大文字小文字無視)。デフォルトは `''`。
:returns: int or None: 見つかったラベルのインデックス。見つからなかった場合は `None`。
"""
return self.find_label_index(regexp = regexp, flag = flag, flags = flag)
[ドキュメント]
def FindDataArray(self, regexp, flag = None, flags = ''):
"""
概要: `find_data_array`のラッパー。
詳細説明: `find_data_array`メソッドと同じ機能を提供し、後方互換性または異なる命名規則のために使用されます。
:param regexp: str or int: 検索する正規表現、またはラベルのインデックス。
:param flag: str or None, optional: 互換性のためのフラグ ('i' は大文字小文字無視)。`flags`引数に優先されます。
:param flags: str, optional: 検索フラグ ('i' は大文字小文字無視)。デフォルトは `''`。
:returns: tuple[str or None, list or None]: 見つかったラベルとデータ配列のタプル。
見つからなかった場合は `(None, None)`。
"""
return self.find_data_array(regexp = regexp, flag = flag, flags = flags)
[ドキュメント]
def read_data(self, idata = [], flags = '', convert_type = None, def_val = None, is_print = True):
"""
概要: 複数のデータ項目を読み込み、それぞれのラベルとデータリストを返します。
詳細説明: `idata`リストで指定された各項目について`find_data_array`を呼び出し、
対応するラベルとデータリストを収集します。これにより、複数のデータ列を一度に効率的に取得できます。
:param idata: list[str or int], optional: 読み込むデータのインデックスまたは正規表現のリスト。デフォルトは空のリスト。
:param flags: str, optional: `find_data_array`に渡される検索フラグ ('i' は大文字小文字無視)。デフォルトは `''`。
:param convert_type: type or None, optional: データ配列の要素を変換する型 (例: `int`, `float`)。デフォルトは `None`。
:param def_val: any, optional: 変換に失敗した場合に使用するデフォルト値。
:param is_print: bool, optional: 現在未使用のパラメータ。デフォルトは `True`。
:returns: tuple[list[str or None], list[list or None]]: 読み込まれたラベルのリストとデータリストのリストのタプル。
"""
labels = []
data_list = []
for idx in idata:
label, data = self.find_data_array(regexp = idx, flags = flags, convert_type = convert_type, def_val = def_val)
labels.append(label)
data_list.append(data)
return labels, data_list