"""
CSVファイルを扱うユーティリティ関数とクラスを提供するモジュール。
:doc:`tkcsv_usage`
"""
import csv
from tklib.tkutils import terminate, pfloat, pint
from tklib.tksci.tkmatrix import make_matrix1
from tklib.tkdatafile import tkDataFile
[ドキュメント]
def savecsv(outfile, x, y, ys):
"""
3つのデータリスト (x, y, ys) をCSVファイルに保存します。
ヘッダー 'x', 'y(raw)', 'y(smooth)' を書き込み、その後に各行のデータを書き込みます。
ファイルオープンに失敗した場合はエラーメッセージを出力します。
:param outfile: 出力CSVファイルのパス。
:type outfile: str
:param x: x軸データを含むリスト。
:type x: list
:param y: 生のy軸データを含むリスト。
:type y: list
:param ys: スムージングされたy軸データを含むリスト。
:type ys: list
:returns: なし
:rtype: None
"""
try:
print("Write to [{}]".format(outfile))
f = open(outfile, 'w')
except:
# except IOError:
print("Error: Can not write to [{}]".format(outfile))
else:
fout = csv.writer(f, lineterminator='\n')
fout.writerow(('x', 'y(raw)', 'y(smooth)'))
# fout.writerows(data)
for i in range(0, len(x)):
fout.writerow((x[i], y[i], ys[i]))
f.close()
[ドキュメント]
class tkCSV(tkDataFile):
"""
CSVファイルを読み書きするためのクラス。
tklib.tkdatafile.tkDataFile を継承し、CSV固有のファイル処理機能を提供します。
CSVファイルのパス指定、読み書きモードの指定、自動オープンなどの機能を含みます。
"""
def __init__(self, path = None, mode = 'r', OpenFile = 1, data_only = True, **args):
"""
tkCSVオブジェクトを初期化します。
親クラス tkDataFile の基本的なファイルハンドリング機能を持ちつつ、
CSVファイル特有のプロパティを初期化します。
`OpenFile` が真の場合、指定されたパスのファイルを読み込みモードで開きます。
:param path: CSVファイルのパス。指定がない場合はNone。
:type path: str, optional
:param mode: ファイルオープンモード ('r', 'w', 'a'など)。デフォルトは 'r'。
:type mode: str, optional
:param OpenFile: 初期化時にファイルを開くかどうかのフラグ。1で開く、0で開かない。
:type OpenFile: int, optional
:param data_only: データを数値として読み込むかどうかのフラグ。現在は使用されていません。
:type data_only: bool, optional
:param args: 親クラス tkDataFile に渡す追加のキーワード引数。
:type args: dict
:returns: なし
:rtype: None
"""
# super(tkFile, self).__init__(path, mode, **args)
self.fp = None
self.path = None
self.mode = None
self.path = self.IfYes(path is not None, path, self.path)
self.mode = self.IfYes(mode is not None, mode, self.mode)
self.cur_row = 0
self.cur_col = 0
self.wb = None
self.ws = None
self.update(**args)
if OpenFile and self.path is not None:
self.Open(self.path, self.mode, data_only)
def __del__(self):
"""
tkCSVオブジェクトが破棄される際にファイルを閉じます。
オブジェクトがガベージコレクションされるときに自動的に呼び出され、
開いているファイルポインタを閉じます。
:returns: なし
:rtype: None
"""
self.Close()
def __str__(self):
"""
オブジェクトの文字列表現を返します。
このメソッドは、クラスの完全パス(例: `module.class`)を返します。
:returns: クラスのパス文字列。
:rtype: str
"""
return self.ClassPath()
[ドキュメント]
def Read_minimum_matrix(self, close_fp = False, delimiter = ',', force_numeric = True):
"""
CSVファイルからヘッダーと数値データを読み込み、リストのリスト形式で返します。
ファイルを開き、ヘッダー行を読み込みます。
ヘッダーの列数に基づいてデータ列数を決定します。
各データ行を読み込み、指定されたデリミタで分割します。
`force_numeric` がTrueの場合、各値を浮動小数点数に変換しようとします。
変換できない場合は元の値を保持します。
読み込んだヘッダーとデータは、オブジェクトの `labelarray` および `datalistarray` 属性にも格納されます。
:param close_fp: 読み込み後にファイルポインタを閉じるかどうかのフラグ。Trueで閉じる、Falseで開いたままにする。
:type close_fp: bool, optional
:param delimiter: CSVファイルの区切り文字。デフォルトはカンマ (',')。
:type delimiter: str, optional
:param force_numeric: 読み込んだデータを強制的に数値に変換するかどうかのフラグ。Trueで数値変換を試みる。
:type force_numeric: bool, optional
:returns: (labels, datalist) のタプル。
`labels` はヘッダーラベルのリスト (str)。
`datalist` は各列のデータを含むリストのリスト (float または str)。
:rtype: tuple[list[str], list[list[float|str]]]
"""
self.Open(self.path, 'r')
f = csv.reader(self.fp, delimiter = delimiter)
labels = []
row = next(f)
for i in range(len(row)):
v = row[i]
if v is None or v == '':
break
labels.append(v)
ncol = len(labels)
# print("header=", labels)
datalist = make_matrix1(ncol, type = 'list')
for row in f:
# print("row=", row)
if row is None or len(row) < ncol:
break
for icol in range(ncol):
if force_numeric:
val = pfloat(row[icol])
else:
val = pfloat(row[icol], defval = row[icol])
datalist[icol].append(val)
icol += 1
if close_fp:
self.Close()
self.labelarray = labels
self.datalistarray = datalist
# print("data=", self.datalistarray)
# print("labels=", labels)
# print("data=", datalist)
return labels, datalist