はじめに
pythonの基礎として、ファイルの読み書きについて記載したいと思います。
環境
python3.6
macOS
基本
ファイルを読み書きするにはopen(filename, mode)を使います。
>>> f = open('file名', 'w')
第一引数にファイル名を、第二引数にはファイルの扱い方について記載します。
第二引数に関しては
読み取り専用:r (引数が省略されている場合はrになります)
書き込み専用:w
追記用:a (書き込まれた内容が自動的にファイルの終端に追加されます)
読み書き両用:r+
バイナリモード:b
with文
withを使うと、同じことをtry-finallyを使って書くより簡単に書くことができます。
>>> f = open('/Users/hoge/Desktop/test.txt')
>>> f.closed
False
>>> f.close()
>>> f.closed
True
>>> with open('/Users/hoge/Desktop/test.txt') as f:
... dt = f.read()
...
>>> f.closed
True
withを使わない場合は、f.close() を呼び出してファイルを閉じる必要があります。
ファイルを閉じなかった場合は、ファイルが開かれたままになる可能性があります。
内容の読み込み
ファイルの内容を読み込むにはread(size)を使います。
sizeはオプションの数値引数で、sizeが省略されたり場合は、ファイルの内容全てを読み込みます。size指定された場合は、指定したバイト数の読みこみを行います。
>>> f = open('/Users/hoge/Desktop/test.txt')
>>> f.read()
'test\n'
f.readline() は1行だけを読み取ります。
\nは読み出された文字列の終端に残ります。空の文字列を返ってきたら、ファイルの終端に達したことが分かります。
>>> f = open('/Users/hoge/Desktop/test.txt')
>>> f.readline()
'test\n'
>>> f.readline()
''
内容の書き込み
f.write(string) は、stringの内容を書き込み、書き込まれた文字数を返します。
>>> f = open('/Users/hoge/Desktop/test.txt',"w")
>>> f.write('This is a test\n')
15
位置について
f.tell()は現在の位置を示す整数を返します。バイナリモードの時にファイルの先頭からのバイト数で返します。
位置を変更するには、f.seek(offset, from_what)を使います。
ファイル位置は基準点にオフセット値を足して計算されます。参照点はfrom_what引数で選びます。
>>> f = open('/Users/hoge/Desktop/test.txt',"rb+")
>>> f.write(b'0123456789abcdef')
16
>>> f.read(1)
b''
>>> f.seek(5)
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2)
13
>>> f.read(1)
b'd'
from_whatの値が
0なら先頭から
1なら現在のファイル位置
2なら終端
を参照点として使います。
※from_whatは省略可能で、デフォルトは0を使います。
json
先ほどのread()は文字列しか返さないため、数値を扱うのは大変です。
int関数とかを使えば、できなくはない?
これを簡単にするために、JSONが使えます。
標準モジュールのjsonは
- 文字列表現に変換(シリアライズ)
- 文字列表現からデータの再構築(デシリアライズ)
ができます。
>>> json_test="""
... {"age":33,
... "weight":78,
... "height":175,
... "area":"chiba"
... }
... """
>>> import json
>>> data = json.loads(json_test)
>>> data
{'age': 33, 'weight': 78, 'height': 175, 'area': 'chiba'}
>>> type(data) #jsonをpythonで辞書型として読み込むことができた
<class 'dict'>
>>> json.dumps(data) #json形式に戻す
'{"age": 33, "weight": 78, "height": 175, "area": "chiba"}'
>>> json.dump(data, open("data.json","w")) #ファイルの書き込み
>>> json.load(open("data.json"))#読み込み確認
{'age': 33, 'weight': 78, 'height': 175, 'area': 'chiba'}