Pythonを使ったオブジェクト指向で、text / csv / excel(xlsx) のテキスト部分を書き換えるコードを書こうと思っています。
具体的にはファイルと置換前後の辞書を取り、それを書き換えたファイルを出力させたいというのがおおまかなやりたいことです。
入力:
- file_path : "path/to/file"
- translate_dict: {"sato": "<DELETED_1>", "kato": "<DELETED_2>", ...}
出力:
- file_path: "path/to/translated_file" # 元ファイルのsatoを<DELETED_1>に、katoを<DELETED_2>に置換した、入力と同じ拡張子のファイル
ここでファイルの拡張子ごとにオブジェクトを作成するのが筋がよいのかなと思いました。
class (メソッドはすべて同じ):
- TextHandler
- _load(path: str) # ファイルを読み込む。初期化で呼び、読込結果はプライベート変数に保存。
- to_text() -> str # ファイル内容を文字列型で表示。ロギング用。
- replace(d: dict[str, str]) -> str # _loadで読んだプライベート変数を元に置換処理。置換結果はファイルに書き込む。置換後のファイルパスを返す。
- CsvHandler
- ExcelHandler
このようにすることで、それぞれの固有の置換処理を実装できると考えています。
- text: str.formatを用い置換します
- csv: それぞれのセルをstr.formatで置換する
- excel: xlsxをzipとして展開し、内部の複数あるxmlファイル中の属性やテキストノードをすべて置換する
一方で、それぞれのクラス内に、一般的な処理である置換がはいるのは、どこか違和感があります。
実装的な意味では置換はtext / excelで全くしていることが異なります (textは文字列置換だが、csvはセルごとの置換で、excelはzipで解凍した複数のxmlファイルのノード置換) が、抽象的には内部の文字列を置き換える、という普遍的なことを行っているからです。
置換を拡張したい場合、それぞれのクラスのreplace関数3箇所を変更する必要があります。
しかし、置換をclass Replacer等として外に出そうとすると、Replacerは入力型としてstr, list[str], list[list[str]], list[xml_file] (あるいはpath_to_zip: str?) を扱う必要があり、責務が重い気がしています...
より良い設計があれば教えていただけると嬉しいです。
よろしくお願いします。
その他:
- 現在のユースケースでは、置換処理は1ファイル1度しか呼ばれません。
- 質問者について: オブジェクト指向初心者 (オブジェクト指向でなぜつくるのかを読んで、オブジェクト指向設計実践ガイドを買った) です。メインで使う言語はpythonで、大学以降6年程度触っています。会社はIT系で、プログラミングもしますが、perl / shell script / js / css 等の保守が多いです。
