はじめに
Pythonでファイル操作するための基礎知識についてまとめます。
対象:Pythonの学習を始めた方向け
動作環境:Python3.8.3(OSはMacOS)
ファイルを読み書きする
ファイルを開く
openメソッド
- 開く対象ファイルと、開き方(読込/書込)を指定します。
- ファイルオブジェクトが返却されます。
- ファイルを操作した後は、closeメソッドの実行が必要です(メモリから解放するため)。
f = open("filename", "mode")
- "mode"の種類
mode | 説明 |
---|---|
r | 読込モード。 |
w | 上書きモード。既存の内容は破棄する。 |
a | 追記モード。ファイルの末尾へ追記する。 |
x | ファイル新規作成専用の書込モード。ファイルが存在する場合はエラーを返却し、書込は行われない。 |
r+ | 読み書き両用モード。 |
省略すると、"r"として処理されます。
- ファイルの種類を扱う"mode"
前掲の"mode"と組み合わせて指定できます。
mode | 説明 |
---|---|
t | テキストモード。openメソッドのデフォルトモード。改行コードをプラットフォーム固有の記号から「\n」に変換する。 |
b | バイナリモード。テキストファイル以外はバイナリモードの利用を推奨。 |
withキーワード
withキーワードを使うと必ずファイルオブジェクトはcloseされるので、try〜finallyで実装するより簡潔に書くことができます。
with open("filename") as f:
f.read()
ファイルオブジェクトのメソッド
f.read(size)
- sizeに指定した値だけ、文字列 (テキストモードの場合) か bytes オブジェクト (バイナリーモードの場合) として返却します。
- sizeは省略されたり負の数を指定された場合、ファイルの全内容を返却します。
- ファイルの終端に達している場合、空の文字列 ('') を返却します。
>>>f.read(10)
'Hello Pyth'
f.readline()
- ファイルから1行のみ読み取り、返却します。
- 終端に改行文字(\n)を含みます(改行文字を含まない最終行を除く)。
>>> f.readline()
'Hello Python\n'
複数行の読込
- ループ処理に効率的にファイルの読み込みを実行できます。
- ファイルの全ての行をリスト形式で扱いたい場合は、list(f)やf.readlines()を使います。
>>> for line in f:
... print(line, end='')
...
Hello Python
Hello Java
Hello Ruby
f.write(string)
- stringの内容をファイルに書き込み、書き込まれた文字数を返却します。
- ファイルを閉じるまで、witeメソッドを呼び出すごとに追記されます。
>>> with open("sample.txt", "w") as f:
... f.write("Japan\n")
... f.write("USA\n")
... f.write("China\n")
...
6
4
6
>>> with open("sample.txt", "r") as f:
... f.read()
...
'Japan\nUSA\nChina\n'
f.tell()
-
ファイルの開いている現在の位置を示す整数を返却します。
-
現在の位置が先頭の場合は「0」を返却
>>> with open("sample.txt", "r") as f:
... f.tell()
...
0
- 5バイト分読み込むと現在位置も移動
>>> with open("sample.txt", "r") as f:
... f.read(5)
... f.tell()
...
'Japan'
5
f.seek(offset, whence)
- ファイル位置を、基準点(whence)にオフセット値(offset)を加算して計算します。
- whenceには0:先頭、1:現在の位置、2:終端を指定します。省略した場合は0:先頭として振る舞います。
>>> with open("sample.txt", "rb+") as f:
... f.write(b"0123456789abcdef")
... f.seek(3) #先頭から3バイト分
... f.read(1)
... f.seek(-1,2) #終端から1バイト分
... f.read(1)
...
16
3
b'3'
15
b'f'
おわりに
今回は基礎の基礎な内容でした。
次はCSVやjsonなどの扱いについて、理解を深めていきたいと思います(ライブラリが提供されているとのこと)。