環境
- Windows 10
- Python 3.10.1
前提知識
- テキストファイルの読み書きはpythonの標準ライブラリに組み込まれているので、openメソッドでファイルを開き、readメソッドで読み込みが、writeメソッドで書き込みが可能
- openメソッドには最低限、①対象のファイルのパス、②動作モード、③エンコードを引数として指定する
- openメソッドに指定するmodeは、ケースに応じて以下のように指定する
- 読み込み(r または rt)
- 書き込み(w または wt)
- 追記(a または at)
読み込み
ファイル全体を文字列として読むこむ
- readメソッドを使用すると、ファイル全体を文字列として読みこむことが可能です
- openでファイルが開けないときは、FileNotFoundErrorが送出されるので、エラーハンドリングが必要です
- 読み取り専用で開くので、modeは"r"または"rt"を指定する
from typing import IO
from shared.Domain.Text.x_text import XText
class TextFileService:
def __init__(self, x_text: XText):
self.x_text = x_text
def _open(self, mode: str, encoding: str) -> IO:
try:
f = open(self.x_text.filepath().of_text(), mode=mode, encoding=encoding)
return f
except FileNotFoundError:
raise FileNotFoundError
def read(self, encoding: str) -> str:
try:
f = self._open(mode="r", encoding=encoding)
return f.read()
except FileNotFoundError:
raise FileNotFoundError
finally:
if "f" in locals():
f.close()
上記では、openメソッドは、読み取り時以外にも書き込み時にも必要となるので、共通のメソッド(_open)として切り出しています。また、openメソッドでファイルを開いた後は、途中でエラーが発生したとしてもファイルを閉じる必要があるので、finallyで確実に閉じられるようにしています
ファイル全体をリストとして読むこむ
- readlinesメソッドを使用すると、ファイル全体をリストとして読みこむことが可能です
from typing import IO, List
from shared.Domain.Text.x_text import XText
class TextFileService:
def __init__(self, x_text: XText):
self.x_text = x_text
def _open(self, mode: str, encoding: str) -> IO:
try:
f = open(self.x_text.filepath().of_text(), mode=mode, encoding=encoding)
return f
except FileNotFoundError:
raise FileNotFoundError
def readline(self, encoding: str) -> List[str]:
try:
f = self._open(mode="r", encoding=encoding)
return [s.strip() for s in f.readlines()]
except FileNotFoundError:
raise FileNotFoundError
finally:
if "f" in locals():
f.close()
masayan
開いたファイル全体を行ごとに分割したリストとして取得できますが、各行には改行コード\nを含んでいるため、stripで改行コードを削除しています
sample.txt
ruby,python
java,php
javascript
例えば、上記のようなsample.txtを読み込むと、以下のような結果になります。
['ruby,python', 'java,php', 'javascript']
書き込み
- 上書きの場合は、openメソッドのmodeには"w"または"wt"を指定
- 追記の場合は、openメソッドのmodeには"a"または"at"を指定
- 呼び出し側から追記か上書きかどうかを指定できるようにするため、is_overwriteというパラメーターを指定できるようにしています
from typing import IO, List
from shared.Domain.Text.x_text import XText
class TextFileService:
def __init__(self, x_text: XText):
self.x_text = x_text
def _open(self, mode: str, encoding: str) -> IO:
try:
f = open(self.x_text.filepath().of_text(), mode=mode, encoding=encoding)
return f
except FileNotFoundError:
raise FileNotFoundError
def write(
self, content: List[str], is_overwrite: False, encoding, needs_indention: True
) -> str:
# 上書き
if is_overwrite:
mode = "w"
# 追記
else:
mode = "a"
try:
f = self._open(mode=mode, encoding=encoding)
if needs_indention:
f.write("\n".join(content))
else:
f.writelines(content)
# 書き込み後に最新のテキスト情報を返す
f = self._open(mode="r", encoding=encoding)
return f.read()
except FileNotFoundError:
raise FileNotFoundError
finally:
if "f" in locals():
f.close()
改行不要なら、writelinesメソッドで文字列のリストをそのまま繋げて書き込み、必要なら、writeメソッドで文字列のリストの各要素に改行コードを付与して書き込みするようにしています。
以上です。
まとめ
いかがでしたでしょうか。本記事では、Python組み込みのopen関数でテキストファイルを読み書きする方法について紹介しています。ぜひ参考にしてみてください。