1. ホーム 
  2. 備忘録 
  3. Python

ファイルの作成

ファイルの書き込み

open関数を使うとファイルを作成して書き込んだり、存在するファイルを開いて上書きしたり、追記したりできる

使用方法を以下に記載する

lesson.py

# ファイルの書き込み(上書きモード)
f = open('test.txt', 'w')  # write
f.write('Test')
f.close()

# ファイルの書き込み(追記モード)
f = open('test.txt', 'a')  # append
f.write('test')
f.close()

# ファイルに文字を書き込む方法は print関数 でも可能
# 一般的には writeメソッド が使われることが多い
f = open('test.txt', 'a')
print('Hello', file=f)
f.close()

ファイルをopenで開いたあとは必ずcloseで閉じなければいけない

これを忘れるとファイルが開いたままなのでメモリが使用されっぱなしになるほか、異常終了時にデータが消失してしまうなど様々な問題に発展する可能性がある

closeを忘れないためには、withステートメントを使うと便利である


withステートメント

ファイルを開いた際に必ず最後に行わなければいけない閉じる処理などの後処理を自動で行ってくれる仕組み

後処理漏れを防げるだけでなく、コードを短くスッキリさせられて可読性もあがるため、積極的に使った方が良い

使用方法を以下に記載する

lesson.py

# f = open('test.txt', 'w')
# f.write('Test')
# f.close()
# 上記は withステートメントを使って以下に書き換えられる
with open('test.txt', 'w') as f:
    f.write('Test')

ファイルの読み込み

ファイルの読み込み方法はopen関数のオプションを 'r'(read) に変えるだけである

読み込んだ後は全体を取り出すのか、一行ずつ取り出すのか、数文字(数バイト)ごと取り出すのかによってメソッドを使い分ける

具体的な例を以下に記載する

lesson.py

###
# ファイルを作成
s = """\
AAA
BBB
CCC
DDD
"""
with open('test.txt', 'w') as f:
    f.write(s)

# ファイルの読み込み
with open('test.txt', 'r') as f:
    # f.read()で一括読み込みができる
    print(f.read())
    f.seek(0)  # シーク位置を元に戻す
    # 結果
    # AAA
    # BBB
    # CCC
    # DDD
    # 


    # f.readline()で一行ずつ読み込む
    while True:
        line = f.readline()
        print(line, end='')  # print関数はデフォルトで改行が入ってしまうので無くす
        if not line:
            f.seek(0)  # シーク位置を元に戻す
            break
    # 結果
    # AAA
    # BBB
    # CCC
    # DDD
    #


    # f.read(chunk) で chunk数 ごとに読み込む
    while True:
        chunk = 2
        line = f.read(chunk)
        print(line)
        if not line:
            f.seek(0)  # シーク位置を元に戻す
            break
    # 結果
    # AA
    # A
    #
    # BB
    # B
    #
    # CC
    # C
    #
    # DD
    # D
    #

ファイルの読み書きを同時に行う

ファイルの読み書きを同時に行う場合はオプションに 'w+' や 'r+' をつけると可能である

'w+' で開いた場合は、書き込んだ後に読み込むものとして開くので、ファイルの中身は最初にクリアされる

なお、書き込んだあとはシーク位置を適切な位置に戻さないと、read() を呼んでも何も出力されないので注意すること

'r+' で開いた場合は、読み込んだ後に書き込むものとして開くので、ファイル自体が存在しなければエラーとなる