【Python】ファイル操作をしてみよう!

Pythonロゴ

Pythonにはテキストの作成・追記等を行う機能や圧縮ファイルにまとめるモジュールなど用意されています。
今回はファイルの読み書きについて確認していきます。

テキストファイル

テキストファイルは文字など文字コードによって表されるデータだけが含まれるファイルになります。Pythonでは基本の関数で読み書きが簡単に行えます。
※画像ファイルや動画ファイルはバイナリファイルになるため別になります。

書き込み

open関数を利用してファイルの書き込み・読み込みを行うことができます。
処理を行う際、モード( w | a | r )により処理内容を変えることができます。

fp = open('ファイルパス', 'モード')

# モード
# w : 書き込み(存在しない場合、新規作成 存在する場合、上書き)
# a : 追記(存在しない場合、新規作成 存在する場合、追記)
# r : 読み込み

テキストファイルを書き込みしてみます。ファイルが存在しない場合は新規作成、存在する場合は上書きにて処理されます。

fp = open('sample/file.txt', 'w')
fp.write('test1\n')
fp.write('test2\n')
fp.close()

上記、プログラムを実行することでsampleディレクトリの中にテキストファイルが生成されます。

test1
test2

追記

保存されているファイルの最終行に追記をおこないます。
ファイルが存在しない場合は新規ファイルが生成されます。

fp = open('sample/file.txt', 'a')
fp.write('test3\n')
fp.close()

上記、プログラムを実行することでsampleディレクトリの中にあるfile.txtにtest3が追記されます。

test1
test2
test3 <= 追記されました

読み込み

先ほど書き込みをしたファイルを読み込んで出力します。

fp = open('sample/file.txt', 'r')
print(fp.read())
fp.close()

# 結果
# test1
# test2

読み込みファイルは書き込みで生成したファイルになります。

行単位で処理をする場合

上記読み込みの場合、保存されているテキストを1度に出力するようになっています。処理によっては改行単位で1行ごとに取得をしたい場合もあると思います。
1行単位で取得する場合は下記のようになります。

fp = open('sample/file.txt', 'r')
while True:
    line = fp.readline()
    if (not line):
        break
    print(line, end='') # 1行単位
fp.close()

# 結果
# test1
# test2

書き込み後に読み込み

テキストファイルを操作した後に、内容を出力する事があると思います。
open関数で w または r を指定すると1つの操作しかでき無い状態になります。
書き込み後に読み込み・読み込み後に書き込みをする場合は w+ または r+ を指定します。

fp.write をするとファイルポインタが最終文字まで移動しています、テキストを読み込むため fp.seek(0) ポインタ位置を最初に戻します。

fp = open('sample/file.txt', 'w+')
fp.write('test\n')
fp.seek(0)  # ポインタを0文字目に戻す
print(fp.read())
fp.close()

# 結果
# test

CSVファイル

CSV(Comma Separated Values)ファイルは区切り文字で成形されたテキストファイルになります。区切り文字はカンマ(,)がよく使用されています。
処理時は csv モジュールを使用します。

書き込み

import csv

with open('sample/file.csv', 'w') as fp:
    # レコード変数定義
    fields = ['Name', 'Age']
    writer = csv.DictWriter(fp, fieldnames=fields)

    # ヘッダー書き込み
    writer.writeheader()

    # レコード書き込み
    writer.writerow({'Name': 'AAA', 'Age': '21'})
    writer.writerow({'Name': 'BBB', 'Age': '25'})
Name,Age
AAA,21
BBB,25

追記

import csv

with open('sample/file.csv', 'a') as fp:
    # レコード変数定義
    fields = ['Name', 'Age']
    writer = csv.DictWriter(fp, fieldnames=fields)

    # レコード書き込み
    writer.writerow({'Name': 'CCC', 'Age': '30'})

上記、プログラムを実行することでsampleディレクトリの中にあるfile.csvにCCC:30が追記されます。

Name,Age
AAA:21
BBB:25
CCC:30 <= 追記されました

読み込み

with open('sample/file.csv', 'r') as fp:
    reader = csv.DictReader(fp)
    for row in reader:
        print(row['Name'] + ':' + row['Age'])

読み込みファイルは書き込みで生成したファイルになります。

ファイルの圧縮

圧縮アルゴリズムを使いファイルの内容を変更すること無くサイズ容量を下げることができます。また複数のファイルを1つにまとめることもできます。

TARGZで圧縮 (.tar.gz)

Mac PC / Linux でおなじみの tar.gz 形式で圧縮・解凍ができます。
処理時は tarfile モジュールを使用します。

import tarfile

with tarfile.open('sample/file.tar.gz', 'w:gz') as fp:
    fp.add('sample')

TARGZの解凍

import tarfile

with tarfile.open('sample/file.tar.gz', 'r:gz') as fp:
    fp.extractall('targz')

ZIPで圧縮 (.zip)

Windowsでおなじみの zip 形式で圧縮・解凍ができます。
処理時は zipfile モジュールを使用します。

import zipfile

with zipfile.ZipFile('sample/file.zip', 'w') as fp:
    fp.write('sample')
    fp.write('sample/file.txt')

ZIPの解凍

import zipfile

with zipfile.ZipFile('sample/file.zip', 'r') as fp:
    fp.extractall('zip')

一時ファイル

Pythonには処理中だけファイルを生成して、終了時に削除する一時ファイルが利用できます。処理時は tempfile モジュールを使用します。
サーバにアップされたファイルや集計処理中の一時ファイルなどに活用できます。テキストファイルやCSVファイルと同じ操作で作成する事ができます。

書き込み

import tempfile

with tempfile.NamedTemporaryFile(delete=False) as tp:
    with open(tp.name, 'w+') as fp:
        fp.write('test\n')
        fp.seek(0)  # ポインタを0文字目に戻す
        print(fp.read())

print(tp.name)  # 添付ファイル位置

# 結果
# /tmp/tmpud9idfqp  <= 名前は生成時に決まります

with構文でクローズ忘れ防止

上記サンプルプログラムで使用しているのですが、with構文を利用してファイルの読み書きをしている箇所があります。
with構文はファイル処理をする際、open から close処理まで対応をしないといけないのですがclose処理を省略できるようになります。

with構文の活用方法はファイル処理だけで無く、通信の開始・終了、データベース接続の開始・終了にも利用できます。

with構文の書き方

with open('ファイルパス', 'モード') as ファイルポインタ名:
with open('sample/file.txt', 'r') as fp:
    print(fp.read())

サンプルプログラム

こちらの記事で作成したプログラムはGitHub環境にアップしております。
下記からダウンロードいただけます。

参考 file.py スクリプトGitHub python-beginner