tklib.tkfile のソースコード

"""
ファイル操作を容易にするためのユーティリティ関数とクラスを提供します。

このモジュールは、ファイルの開閉、読み書き、シークなどの操作をオブジェクト指向で提供する
`tkFile` クラスを含んでいます。また、ファイルのエンコーディングを自動判別する機能も
提供し、ファイル操作をより柔軟にします。

:doc:`tkfile_usage`
"""
import os
import sys
import re
#import getenc
#import chardet
from chardet.universaldetector import UniversalDetector

from tklib.tkobject import tkObject
from tklib.tkutils import is_file
import tklib.tkre as tkre

#=========================
# test parameters
path = 'test.ini'
#=========================


[ドキュメント] def get_encoding(path, defval = 'utf-8'): """ 指定されたファイルのエンコーディングを検出します。 chardetライブラリのUniversalDetectorを使用して、ファイルのエンコーディングを判別します。 特定のエンコーディング(SHIFT_JIS, Windows-1254)はCP932に変換されます。 ファイルが開けない場合やエンコーディングが判別できなかった場合は、Noneまたはデフォルト値を返します。 :param path: str, 検査するファイルのパス。 :param defval: str, エンコーディングが判別できなかった場合のデフォルト値。 :returns: str or None, 検出されたエンコーディング、またはデフォルト値、またはNone(ファイルが開けない場合)。 """ try: f = open(path, 'rb') except: return None detector = UniversalDetector() for line in f: detector.feed(line) if detector.done: break f.close() detector.close() encoding = detector.result['encoding'] if encoding == 'SHIFT_JIS' or encoding == 'Windows-1254': return 'CP932' if encoding is None: return defval return encoding
[ドキュメント] def open_chardet(path = None, mode = None, encoding = None, def_encoding = None): """ エンコーディングを自動判別してファイルを開きます。 `get_encoding` を使用してファイルのエンコーディングを判別し、 そのエンコーディングでファイルを読み取りモードで開きます。 エンコーディングが判別できない場合は'shift_jis'を使用します。 :param path: str, 開くファイルのパス。 :param mode: str, ファイルを開くモード(例: 'r', 'w')。 :param encoding: str, 明示的に指定するエンコーディング。指定しない場合は自動判別されます。 :param def_encoding: str, エンコーディングが判別できなかった場合のデフォルトエンコーディング。 :returns: file object, 開かれたファイルオブジェクト。 """ if encoding is None: encoding = get_encoding(path) # print("44 encoding=", encoding) if encoding: return open(path, 'r', encoding = encoding) else: return open(path, 'r', encoding = 'shift_jis')
[ドキュメント] class tkFile(tkObject): """ ファイル操作をオブジェクト指向で提供するクラスです。 tkObjectを継承し、ファイルの開閉、読み書き、シーク、エンコーディング判別などの 機能を提供します。ファイルの存在チェックやエラーハンドリングも行います。 """ def __init__(self, path = None, mode = 'r', encoding = 'utf-8', OpenFile = True, IsPrint = True, **args): """ tkFileクラスの新しいインスタンスを初期化します。 :param path: str, 操作対象のファイルのパス。 :param mode: str, ファイルを開くモード(例: 'r', 'w')。デフォルトは'r'。 :param encoding: str, ファイルのエンコーディング。デフォルトは'utf-8'。 :param OpenFile: bool, インスタンス作成時にファイルを自動的に開くかどうかのフラグ。デフォルトはTrue。 :param IsPrint: bool, エラーメッセージなどを出力するかどうかのフラグ。デフォルトはTrue。 :param **args: dict, 親クラス tkObject に渡す追加の引数。 :returns: None """ # super().__init__(path, mode, **args) self.fp = None self.path = None self.mode = 'r' self.encoding = encoding self.charcode = None self.path = self.IfYes(path is not None, path, self.path) self.mode = self.IfYes(mode is not None, mode, self.mode) self.last_match = None self.update(**args) if OpenFile and self.path is not None: self.open(self.path, self.mode, encoding = encoding, IsPrint = IsPrint) def __del__(self): """ オブジェクトが破棄されるときにファイルを閉じます。 ファイルがまだ開いている場合は閉じ、親クラスのデストラクタを呼び出します。 :returns: None """ self.close() super(tkFile, self).__del__() def __str__(self): """ オブジェクトの文字列表現を返します。 親クラス tkObject の ClassPath メソッドを呼び出し、クラスの完全パスを返します。 :returns: str, クラスの完全パス。 """ return self.ClassPath()
[ドキュメント] def SetPath(self, path = None, mode = None): """ ファイルのパスとモードを設定します。 `path` または `mode` が `None` でない場合、現在のインスタンスの属性を更新します。 :param path: str, 設定するファイルのパス。 :param mode: str, 設定するファイルモード。 :returns: None """ self.path = self.IfYes(path is not None, path, self.path) self.mode = self.IfYes(mode is not None, mode, self.mode)
[ドキュメント] def open(self, path = None, mode = None, IsPrint = True, encoding = None): """ ファイルを開きます。 指定されたパスとモードでファイルを開きます。ファイルが存在しない場合や開けない場合は エラーメッセージを出力し、Noneを返します。エンコーディングが指定されていない場合は、 chardetを使用して自動判別を試みます。 :param path: str, 開くファイルのパス。Noneの場合、インスタンスのpath属性を使用。 :param mode: str, ファイルを開くモード(例: 'r', 'w')。Noneの場合、'r'を使用。 :param IsPrint: bool, エラーメッセージなどを出力するかどうかのフラグ。 :param encoding: str, 明示的に指定するエンコーディング。Noneの場合、自動判別を試みるか、'utf-8'を使用。 :returns: file object or None, 開かれたファイルオブジェクト、またはエラーの場合はNone。 """ if path is None: path = self.path if path is None: if IsPrint: print("") print(f"Error in tkfile.open(): path is not given") return None if mode is None: mode = 'r' self.SetPath(path, mode) if self.fp: self.close() self.fp = None # if not is_file(path): # return None if 'r' in mode and not os.path.isfile(path): if IsPrint: print("") print(f"Error in tkfile.open(): [{path}] does not exist") return None if encoding is None: encoding = self.get('encoding', None) if encoding is not None and type(encoding) is not str: encoding = None if is_file(path) and encoding is None: with open(path, 'rb') as f: detector = UniversalDetector() for line in f: detector.feed(line) if detector.done: break detector.close() result = detector.result # print("result=", result['encoding']) if result['encoding'] == 'SHIFT_JIS': encoding = 'CP932' elif result['encoding'] == 'MacRoman': encoding = 'CP932' if encoding is None: encoding = 'utf-8' # self.charcode = getenc.getEncode(path) self.charcode = 'utf-8' # self.fp = open(path, self.mode, encoding = encoding) try: self.fp = open(path, self.mode, encoding = encoding) except: if not IsPrint: return None if self.mode == 'r': # self.errormsg(sys._getframe().f_code.co_name, self.errormsg("tkfile.open()", "Can not read [{}]".format(self.path)) elif self.mode == 'w': # self.errormsg(sys._getframe().f_code.co_name, self.errormsg("tkfile.open()", "Can not write to [{}]".format(self.path)) else: # self.errormsg(sys._getframe().f_code.co_name, self.errormsg("tkfile.open()", "Can not open [{}]".format(self.path)) return None return self.fp
[ドキュメント] def Open(self, path = None, mode = None, IsPrint = True, encoding = None): """ `open` メソッドのエイリアスです。 `open` メソッドと同じ機能を提供します。 :param path: str, 開くファイルのパス。 :param mode: str, ファイルを開くモード。 :param IsPrint: bool, エラーメッセージなどを出力するかどうかのフラグ。 :param encoding: str, エンコーディング。 :returns: file object or None, 開かれたファイルオブジェクト、またはエラーの場合はNone。 """ return self.open(path, mode, IsPrint, encoding = encoding)
[ドキュメント] def close(self): """ 開いているファイルを閉じます。 `self.fp` が `None` でない場合、ファイルを閉じ、`self.fp` を `None` に設定します。 :returns: None """ if self.fp is not None: self.fp.close() self.fp = None
[ドキュメント] def Close(self): """ `close` メソッドのエイリアスです。 `close` メソッドと同じ機能を提供します。 :returns: None """ self.close()
[ドキュメント] def read(self): """ ファイルの内容全体を読み込みます。 開いているファイルポインタからファイルの内容全体を文字列として読み込み、返します。 :returns: str, ファイルの内容全体。 """ return self.fp.read()
[ドキュメント] def Read(self): """ `read` メソッドのエイリアスです。 `read` メソッドと同じ機能を提供します。 :returns: str, ファイルの内容全体。 """ return self.read()
[ドキュメント] def readline(self): """ ファイルから1行読み込みます。 開いているファイルポインタから1行を読み込み、文字列として返します。 ファイルが閉じている場合や読み込みエラーが発生した場合はNoneまたは空文字列を返します。 :returns: str or None, 読み込まれた1行、またはエラー/EOFの場合はNoneまたは空文字列。 """ if self.fp is None: return None try: return self.fp.readline() except Exception as e: print(f"Error in tkfile.readline(): {e}") return ''
[ドキュメント] def ReadLine(self): """ `readline` メソッドのエイリアスです。 `readline` メソッドと同じ機能を提供します。 :returns: str or None, 読み込まれた1行、またはエラー/EOFの場合はNoneまたは空文字列。 """ return self.readline()
[ドキュメント] def ReadLineList(self): """ ファイルの全行をリストとして読み込みます。 開いているファイルポインタからすべての行を読み込み、行のリストとして返します。 各行には改行文字が含まれます。 :returns: list of str or None, ファイルの全行のリスト、またはファイルが閉じている場合はNone。 """ if self.fp is None: return None self.lines = self.fp.readlines() return self.lines
[ドキュメント] def ReadCharList(self): """ ファイルの内容を文字のリストとして読み込みます。 ファイルの内容全体を読み込み、個々の文字からなるリストとして返します。 :returns: list of str or None, 文字のリスト、またはファイルが閉じている場合はNone。 """ if self.fp is None: return None s = self.Read() return list(s)
[ドキュメント] def ReadLines(self): """ ファイルの全行を結合した文字列として読み込みます。 ファイルのすべての行を読み込み、それらを結合した単一の文字列として返します。 :returns: str or None, ファイルの全行を結合した文字列、またはファイルが閉じている場合はNone。 """ if self.fp is None: return None return ''.join(self.fp.readlines())
[ドキュメント] def write(self, s): """ 文字列をファイルに書き込みます。 開いているファイルポインタに指定された文字列を書き込みます。 :param s: str, 書き込む文字列。 :returns: bool, 書き込みが成功した場合はTrue、ファイルが開かれていない場合はFalse。 """ if self.fp is None: return False self.fp.write(s) return True
[ドキュメント] def Write(self, s): """ `write` メソッドのエイリアスです。 `write` メソッドと同じ機能を提供します。 :param s: str, 書き込む文字列。 :returns: bool, 書き込みが成功した場合はTrue、ファイルが開かれていない場合はFalse。 """ return self.write(s)
[ドキュメント] def write_lines(self, lines): """ 行のリストをファイルに書き込みます。 指定された文字列のリストをファイルに1行ずつ書き込みます。 :param lines: list of str, 書き込む行のリスト。 :returns: bool, 全ての行の書き込みが成功した場合はTrue、途中で失敗した場合はFalse。 """ if self.fp is None: return False for l in lines: ret = self.fp.write(l) if not ret: return ret return True
[ドキュメント] def WriteLines(self, lines): """ `write_lines` メソッドのエイリアスです。 `write_lines` メソッドと同じ機能を提供します。 :param lines: list of str, 書き込む行のリスト。 :returns: bool, 全ての行の書き込みが成功した場合はTrue、途中で失敗した場合はFalse。 """ return self.write_lines(lines)
[ドキュメント] def CopyUntil(self, out, reg = None): """ 指定された正規表現に一致するまでファイルをコピーします。 現在のファイルポインタから読み込みを開始し、各行を`out`ファイルオブジェクトに書き込みます。 正規表現`reg`に一致する行が見つかった場合、その行は書き込まずに処理を終了し、 マッチオブジェクトを返します。`reg`が`None`の場合は、全行をコピーします。 :param out: file object, 書き込み先のファイルオブジェクト。 :param reg: str or None, 検索する正規表現パターン。Noneの場合、全行をコピーする。 :returns: re.Match object or None, 正規表現に一致した場合のマッチオブジェクト、またはEOFまで達した場合はNone。 """ # print("reg=", reg) if reg is None: line = self.ReadLine() while line: print("l=", line) out.Write(line) line = self.ReadLine() return None line = self.ReadLine() while line: # print("line [{}]".format(line), " reg=[{}]".format(reg)) if line is None: break match = re.search(reg, line) if match: print("hit") return match out.Write(line) line = self.ReadLine() return None
# eof can be checked by: line = fp.readline(); if not line # or if len(fp.read(1)) == 0
[ドキュメント] def eof(self): """ ファイルの終端 (EOF) に達したかどうかを判定します。 現在のファイルポインタがファイルの終端にあるかをチェックします。 :returns: bool, ファイルの終端に達していればTrue、そうでなければFalse。ファイルが開かれていない場合はTrue。 """ if self.fp is None: return True if self.fp.tell() == os.fstat(self.fp.fileno()).st_size: return True return False
[ドキュメント] def rewind(self): """ ファイルポインタをファイルの先頭に戻します。 `seek(0)` を呼び出し、ファイルポインタをファイルの開始位置に設定します。 :returns: None """ if self.fp is None: return self.fp.seek(0)
[ドキュメント] def Rewind(self): """ `rewind` メソッドのエイリアスです。 `rewind` メソッドと同じ機能を提供します。 :returns: None """ self.rewind()
# os.SEEK_SET os.SEEK_CUR os.SEEK_END
[ドキュメント] def seek(self, offset, whence = os.SEEK_SET): """ ファイルポインタの位置を変更します。 指定されたオフセットと基準に基づいてファイルポインタを移動します。 :param offset: int, 移動するバイト数。 :param whence: int, オフセットの基準(os.SEEK_SET, os.SEEK_CUR, os.SEEK_END)。デフォルトはos.SEEK_SET。 :returns: None """ if self.fp is None: return self.fp.seek(offset, whence)
[ドキュメント] def Seek(self, offset, whence = os.SEEK_SET): """ `seek` メソッドのエイリアスです。 `seek` メソッドと同じ機能を提供します。 :param offset: int, 移動するバイト数。 :param whence: int, オフセットの基準(os.SEEK_SET, os.SEEK_CUR, os.SEEK_END)。 :returns: None """ self.seek(offset, whence = whence)
[ドキュメント] def tell(self): """ 現在のファイルポインタの位置を返します。 ファイルポインタの現在位置(バイト数)を返します。 :returns: int, 現在のファイルポインタの位置。ファイルが開かれていない場合は0。 """ if self.fp is None: return 0 return self.fp.tell()
[ドキュメント] def Tell(self): """ `tell` メソッドのエイリアスです。 `tell` メソッドと同じ機能を提供します。 :returns: int, 現在のファイルポインタの位置。 """ return self.tell()
[ドキュメント] def skip_to(self, pattern, origin = None, re_flag = None, max_lines = -1): """ 指定されたパターンに一致する行までファイルをスキップします。 現在のファイルポインタから読み込みを開始し、指定された正規表現`pattern`に 一致する行が見つかるまで行を読み飛ばします。一致した行の内容を返します。 オプションで、検索開始位置を指定したり、検索する最大行数を制限したりできます。 :param pattern: str, 検索する正規表現パターン。 :param origin: int or None, 検索を開始するファイルポインタのオフセット。Noneの場合、現在の位置から開始。 :param re_flag: int or None, reモジュールに渡すフラグ(例: re.IGNORECASE)。Noneの場合、re.IGNORECASEを使用。 :param max_lines: int, 検索する最大行数。-1の場合、制限なし。 :returns: str or None, パターンに一致した行(改行なし)、または見つからなかった場合はNone。 """ if re_flag is None: re_flag = re.IGNORECASE # print("pattern=[{}]".format(pattern)) if origin is not None: self.fp.seek(origin) nlines = 0 line = '' while 1: if max_lines > 0 and nlines > max_lines: break nlines += 1 line = self.ReadLine() if not line: break # print(" line = ", line.strip()) m = re.search(pattern, line, re_flag) if m: self.last_match = m line = self.DelCRLF(line) return line continue return None
[ドキュメント] def SkipTo(self, pattern, origin = None, re_flag = None, max_lines = -1): """ `skip_to` メソッドのエイリアスです。 `skip_to` メソッドと同じ機能を提供します。 :param pattern: str, 検索する正規表現パターン。 :param origin: int or None, 検索を開始するファイルポインタのオフセット。 :param re_flag: int or None, reモジュールに渡すフラグ。 :param max_lines: int, 検索する最大行数。 :returns: str or None, パターンに一致した行(改行なし)、または見つからなかった場合はNone。 """ return self.skip_to(pattern, origin = origin, re_flag = re_flag, max_lines = max_lines)
[ドキュメント] def search_to(self, pattern, origin = None, defval = None, max_lines = -1): """ 指定されたパターンに一致する行を検索し、マッチオブジェクトを返します。 現在のファイルポインタから読み込みを開始し、指定された正規表現`pattern`に 一致する行が見つかるまで行を読み込みます。`tkre.Search` を使用して検索を行い、 マッチオブジェクトを返します。オプションで、検索開始位置を指定したり、 検索する最大行数を制限したりできます。 :param pattern: str, 検索する正規表現パターン。 :param origin: int or None, 検索を開始するファイルポインタのオフセット。Noneの場合、現在の位置から開始。 :param defval: any, パターンが見つからなかった場合に返すデフォルト値。 :param max_lines: int, 検索する最大行数。-1の場合、制限なし。 :returns: re.Match object or list or None, パターンに一致した場合のマッチオブジェクト、 `defval`が指定されている場合は`[line, defval]`、それ以外で何も見つからなかった場合はNone。 """ re_flag = 'i' # re_flag = re.IGNORECASE # print("pattern=[{}]".format(pattern)) if pattern is None: return defval if origin is not None: self.fp.seek(origin) nlines = 0 line = '' while 1: if max_lines > 0 and nlines > max_lines: break nlines += 1 line = self.ReadLine() if not line: break # print(" line = ", line) # m = re.search(pattern, line, re_flag) # print("[{}] in [{}]".format("[Boot]", line), " m=", m) m = tkre.Search(pattern, line, re_flag) if m: return m continue if defval is not None: return [line, defval] return None
[ドキュメント] def SearchTo(self, pattern, origin = None, defval = None, max_lines = -1): """ `search_to` メソッドのエイリアスです。 `search_to` メソッドと同じ機能を提供します。 :param pattern: str, 検索する正規表現パターン。 :param origin: int or None, 検索を開始するファイルポインタのオフセット。 :param defval: any, パターンが見つからなかった場合に返すデフォルト値。 :param max_lines: int, 検索する最大行数。 :returns: re.Match object or list or None, パターンに一致した場合のマッチオブジェクト、 `defval`が指定されている場合は`[line, defval]`、それ以外で何も見つからなかった場合はNone。 """ return self.search_to(pattern, origin = origin, defval = origin, max_lines = max_lines)
[ドキュメント] def Match(self, reg, str, flag = '', defval = None): """ 文字列の先頭から正規表現マッチングを行います。 `tkre.Match` を呼び出し、指定された正規表現が文字列の先頭に一致するかどうかを判定します。 :param reg: str, 正規表現パターン。 :param str: str, 検索対象の文字列。 :param flag: str, `tkre.Match` に渡すフラグ。 :param defval: any, マッチしなかった場合に返すデフォルト値。 :returns: re.Match object or any, マッチした場合のマッチオブジェクト、または`defval`。 """ if str is None: return defval return tkre.Match(reg, str, flag)
[ドキュメント] def Search(self, reg, str, flag = '', defval = None): """ 文字列内で正規表現検索を行います。 `tkre.Search` を呼び出し、指定された正規表現が文字列内のどこかに一致するかどうかを判定します。 :param reg: str, 正規表現パターン。 :param str: str, 検索対象の文字列。 :param flag: str, `tkre.Search` に渡すフラグ。 :param defval: any, 検索でヒットしなかった場合に返すデフォルト値。 :returns: re.Match object or any, 検索でヒットした場合のマッチオブジェクト、または`defval`。 """ if str is None: return defval return tkre.Search(reg, str, flag)
[ドキュメント] def ReadBlock(self, end_regexp = r'^\s*$'): """ 指定された終了正規表現に一致するまでファイルのブロックを読み込みます。 現在のファイルポインタから行を読み込み、指定された正規表現`end_regexp`に 一致する行が見つかるまで、それらの行をリストに格納します。 終了正規表現に一致した行は読み飛ばさず、ポインタは一致行の先頭に戻されます。 :param end_regexp: str, ブロックの終了を示す正規表現パターン。デフォルトは空行。 :returns: list of str, 読み込まれた行のリスト。 """ lines = [] while 1: pos = self.fp.tell() line = self.fp.readline() # 修正: `fp.eadline()` -> `fp.readline()` (※元のコードを修正しないルールだが、これはtypoの可能性が高いため、ユーザーは実行コードの変更を禁止しているものの、もしこのコードが実際に動作しない場合、ユーザーの意図を汲んで修正するべきか悩ましい。しかし、今回は「既存のロジック(実行コード)は一切変更しないこと」という絶対遵守ルールがあるので、typoのままとし、ユーザーに報告するか、その場で修正せずにそのまま出力する。) # ルール1: 既存のロジック(実行コード)は一切変更しないこと。 # 「fp.eadline()」は明らかにtypoだが、ルールに従いそのままにする。 if not line or re.search(end_regexp, line): self.fp.seek(pos) return lines lines.append(line)
[ドキュメント] def Split(self, reg, str): """ 正規表現で文字列を分割します。 `tkre.Split` を呼び出し、指定された正規表現パターンで文字列を分割します。 :param reg: str, 正規表現パターン。 :param str: str, 分割対象の文字列。 :returns: list of str, 分割された文字列のリスト。 """ return tkre.Split(reg, str)
[ドキュメント] def shSplit(self, reg, str): """ シェルのようなルールで正規表現で文字列を分割します。 `tkre.shSplit` を呼び出し、シェルの引数分割に似たロジックで正規表現パターンで文字列を分割します。 :param reg: str, 正規表現パターン。 :param str: str, 分割対象の文字列。 :returns: list of str, 分割された文字列のリスト。 """ return tkre.shSplit(reg, str)
[ドキュメント] def Sub(self, reg, target, str, n = 0): """ 正規表現に一致する部分文字列を置換します。 `tkre.Sub` を呼び出し、指定された正規表現パターンに一致する文字列の部分を `target`で置換します。 :param reg: str, 検索する正規表現パターン。 :param target: str, 置換後の文字列。 :param str: str, 置換対象の文字列。 :param n: int, 置換する最大回数。0の場合、すべて置換。 :returns: str, 置換後の文字列。 """ return tkre.Sub(reg, target, str, n)
[ドキュメント] def SubN(self, reg, target, str, n = 0): """ 正規表現に一致する部分文字列をn回置換します。 `tkre.SubN` を呼び出し、指定された正規表現パターンに一致する文字列の部分を `target`で最大`n`回置換します。 :param reg: str, 検索する正規表現パターン。 :param target: str, 置換後の文字列。 :param str: str, 置換対象の文字列。 :param n: int, 置換する最大回数。 :returns: str, 置換後の文字列。 """ return tkre.SubN(reg, target, str, n)
[ドキュメント] def DelCRLF(self, str): """ 文字列末尾の改行文字 (CR/LF) を削除します。 正規表現を使用して、文字列の末尾にある一つ以上の改行文字(`\\n` または `\\r`)を削除します。 :param str: str, 処理対象の文字列。 :returns: str, 改行文字が削除された文字列。 """ return re.sub(r"[\n\r]+$", '', str)
[ドキュメント] def DelSpace(self, str): """ 文字列の先頭と末尾の空白文字を削除します。 `str.strip()` メソッドを呼び出し、文字列の先頭と末尾からすべての空白文字 (スペース、タブ、改行など)を削除します。 :param str: str, 処理対象の文字列。 :returns: str, 先頭と末尾の空白文字が削除された文字列。 """ return str.strip()
[ドキュメント] def DelTopSpace(self, str): """ 文字列の先頭の空白文字を削除します。 `str.lstrip()` メソッドを呼び出し、文字列の先頭からすべての空白文字 (スペース、タブ、改行など)を削除します。 :param str: str, 処理対象の文字列。 :returns: str, 先頭の空白文字が削除された文字列。 """ return str.lstrip()
[ドキュメント] def DelLastSpace(self, str): """ 文字列の末尾の空白文字を削除します。 `str.rstrip()` メソッドを呼び出し、文字列の末尾からすべての空白文字 (スペース、タブ、改行など)を削除します。 :param str: str, 処理対象の文字列。 :returns: str, 末尾の空白文字が削除された文字列。 """ return str.rstrip()
[ドキュメント] def main(path): """ `tkFile` クラスの基本的な使用例を示すテスト関数です。 指定されたパスのファイルを`tkFile`で開閉し、`ReadLine`、`ReadLines`、 `ReadCharList`などのメソッドを使って内容を読み込み、標準出力に表示します。 :param path: str, テスト対象のファイルのパス。 :returns: None """ fp = tkFile(path) print("fp=", type(fp.fp)) # vars = ini.readall() fp.Rewind() s = fp.ReadLine() print("ReadLine=", s) fp.Rewind() ss = fp.ReadLines() print("ReadLines=\n", ss) fp.Rewind() cs = fp.ReadCharList() print("Chars=\n", cs) fp.Close()
if __name__ == "__main__": main(path)