今回はファイルの読み書きの方法について紹介します。
Contents
ファイルの読み書きの基本
pythonのファイルの読み書きも他のプログラミング言語と同様に以下の流れとなります。
1.ファイルを開く
2.ファイルに対して読み書きをする
3.ファイルを閉じる
ここではこれらの流れを説明し、残りはファイル操作に関する様々の内容について補足説明します。
ファイルを開く
ファイルを開くにはopen関数を使います。引数にはファイルパスとモードを指定します。ファイルを読み込み場合は「r」、ファイルへ書き込む場合は「w」を指定します。また、日本語のファイルを開くにはcodecsモジュールを読み込みcodecs.open関数を使い、ファイルパスとモードの他に文字コードとエラーの扱いを指定します。それぞれの詳細な値は以下の通りです。
モード | 指定モード |
読み取りモード | r |
書き込みモード | w |
追記モード | a |
読み取りモード(バイナリ) | rb |
書き込みモード(バイナリ) | wb |
追記モード(バイナリ) | ab |
バイナリファイルを開く(open(ファイルパス,モード))
ファイルに日本語が含まれないファイルを開くには『open(ファイルパス,モード)』を使います。open関数の戻り値は指定したファイルへのポインタをもつオブジェクトです。
>>> f = open('test.txt','r')
日本語ファイルを開く(codecs.open(ファイルパス,モード,文字コード,エラー))
日本語のファイルを開くには、codecsモジュールを読み込み、『codecs.open(ファイルパス,モード,文字コード,エラー)』を使います。予め、どの文字コードで開くはここで指定します。エラーのignoreはエラーが発生しても無視することを意味しています。
>>> import codecs
>>> file = codecs.open('test1111.py','r','utf8','ignore')
>>> print(file.readline())
あいうえお
ファイルを読み込む
ファイルの読み込みはファイル内の全てのデータを読み込む方法と一行ずつ読み込む方法とがあります。
ファイル内のデータを全て読み込む(ファイルオブジェクト.read())
ファイル内のデータを全て読み込むには、『ファイルオブジェクト.read()』を使います。
>>> import codecs
>>> file = codecs.open('test1111.py','r','utf8','ignore')
>>> print(file.read())
あいうえお
かきくけこ
ファイル内のデータを一行ずつ読み込む(ファイルオブジェクト.readline())
ファイル内のデータを一行ずつ読み込むには、『ファイルオブジェクト.readline()』を使います。行末に改行が付随することに注意してください。
>>> import codecs
>>> file = codecs.open('test1111.py','r','utf8','ignore')
>>> print(file.readline())
あいうえお
>>> print(file.readline())
かきくけこ
ファイル内のデータ一行ずつ読出してリストにする(ファイルオブジェクト.readlines())
ファイル内のデータを一行ずつリストに格納するには、『ファイルオブジェクト.readlines()』を使います。行末に改行が付随することに注意してください。
>>> import codecs
>>> file = codecs.open('test1111.py','r','utf8','ignore')
>>> file.readlines()
[u'\u3042\u3044\u3046\u3048\u304a\n', u'\u304b\u304d\u304f\u3051\u3053\n']
ファイル内のシーク位置を移動してデータを読み直す(ファイルオブジェクト.seek(オフセット位置))
read系関数を使うとファイル内のシーク位置が行末(EOF)まで行くため、再びread系関数を使ってもデータが読み込まれません。そのため『ファイルオブジェクト.seek(オフセット位置)』を使って任意の場所に改行単位でシークを移動します。0を指定すると先頭に戻ります。
>>> import codecs
>>> file = codecs.open('test1111.py','r','utf8','ignore')
>>> print(file.readline())
あいうえお
>>> print(file.readline())
かきくけこ
>>> print(file.readline())
>>> file.seek(0)
>>> print(file.readline())
あいうえお
>>> print(file.readline())
かきくけこ
ファイルに書き込む
ファイルへデータを書き込むには、1回ずつとまとめての方法があります。
ファイルへデータを1回ずつ書き込む(ファイルオブジェクト.write(文字列))
これは『ファイルオブジェクト.write(文字列)』を使います。一行単位で書き込む場合は行末に「\n」が必要です。
>>> import codecs
>>> file = codecs.open('test1111.py','w','utf8','ignore')
>>> file.write(u'あいうえおかきくけこ\n')
>>> file.close()
>>> file = codecs.open('test1111.py','r','utf8','ignore')
>>> print(file.readline())
あいうえおかきくけこ
ファイルへデータを1行ずつ書き込む(ファイルオブジェクト.writelines(イテレータ))
これは、『ファイルオブジェクト.writelines(イテレータ)』を使います。イテレータにはリストなどを指定します。ただし、値の最後に「\n」をつけなければ改行はされないことに注意してください。
>>> import codecs
>>> file = codecs.open('test1111.py','w','utf8','ignore')
>>> file.writelines([u'あいうえお\n',u'かきくけこ\n'])
>>> file.close()
>>> file = codecs.open('test1111.py','r','utf8','ignore')
>>> print(file.read())
あいうえお
かきくけこ
>>> file.close()
ファイルを閉じる
ファイルを閉じるには『ファイルオブジェクト.close()』を使います。
様々なファイルパスを取得する
ここでは様々なファイルパスの取得方法とパスの結合・分割について説明します。ここではosモジュールのpathモジュールを使うため、文頭で「import os.path」の記述が必要です。
ディレクトリ名を取得する(os.path.dirname(パス))
ディレクトリ名の取得は、『os.path.dirname(パス)』を使います。
>>> os.path.dirname('/home/work/Python/test1112.py')
'/home/work/Python'
ファイル名を取得する(os.path.basename(パス))
ファイル名の取得は、『os.path.basename(パス)』を使います。
>>> os.path.basename('/home/work/Python/test1112.py')
'test1112.py'
ファイルの絶対パスを取得する(os.path.abspath(パス))
ファイルの絶対パスは、『os.path.abspath(パス)』を使います。
>>> os.path.abspath('test1112.py')
'/home/work/Python/test1112.py'
カレントディレクトリの絶対パスを取得する(os.getcwd())
カレントディレクトリの絶対パスを取得するには、『os.getcwd()』を使います。
>>> os.getcwd()
'/home/work/Python'
パスを結合する(os.path.join(パス1,パス2,・・・))
パスの結合は、『os.path.join(パス1,パス2,・・・)』を使います。
>>> os.path.join(os.path.dirname(os.path.abspath('test112.py')),os.path.basename(os.path.abspath('test112.py')))
'/home/work/Python/test112.py'
パスを分割する(os.path.split(パス))
パスを分割するには、『os.path.split(パス)』を使います。戻り値はタプルです。
>>> path = os.path.join(os.path.dirname(os.path.abspath('test112.py')),os.path.b
asename(os.path.abspath('test112.py')))
>>> os.path.split(path)
('/home/work/Python', 'test112.py')
ファイル・ディレクトリに対する操作
ファイルを作成するにはopen関数とwrite関数でできますが、それ以外の削除などはまた別の方法で行います。ここでは、ファイルの削除方法うあディレクトリに関する操作について紹介します。
ファイルを削除する(os.remove(ファイルパス))
ファイルを削除するには、『os.remove(ファイルパス)』を使います。削除するファイルがない場合はエラーとなります。
>>> os.remove('test1112.py')
ファイルをコピーする(shutil.copy(コピー元ファイルパス,コピー先ファイルパス))
ファイルをコピーするには、『shutil.copy(コピー元ファイルパス,コピー先ファイルパス)』を使います。コピー先ファイルパスには新たなファイル名をつけることもできますし、ディレクトリを指定するとその直下に同名でファイルがコピーされます。なお、プロパティ情報もコピーしたい場合は、『shutil.copy2(コピー元ファイルパス,コピー先ファイルパス)』を使ってください。
>>> import shutil
>>> shutil.copy('test1111.py','work')
ディレクトリをつくる(os.mkdir(パス))
ディレクトリを作成するには、『os.mkdir(パス)』を使います。
>>> os.mkdir('test')
ディレクトリを削除する(shutil.rmtree(ディレクトリパス))
ディレクトリを削除する(ディレクトリ内のファイルを含め)にはあ、『shutil.rmtree(ディレクトリパス)』を使います。
>>> import shutil
>>> shutil.rmtree('test')
ディレクトリをコピーする(shutil.copytree(コピー元パス,コピー先パス))
ディレクトリをコピーするには、『shutil.copytree(コピー元パス,コピー先パス)』を使います。
>>> import os
>>> os.mkdir('test')
>>> import shutil
>>> shutil.copytree('test','test2')
ファイルやディレクトリを移動する
ファイルやディレクトリのを移動するには、『os.rename(変更前,変更後)』を使います。
>>> import os
>>> os.rename('test.txt','test/test.txt')
よくつかうもの
その他のよくつかうものについて以下にまとめました。
ファイルやディレクトリがあるかを調べる(os.path.exists(パス))
ファイルやディレクトリがあるかを調べるには、『os.path.exists(パス)』を使います。
>>> os.path.exists('test1112.py')
True
カレントディレクトリを変える(os.chdir(変更後パス))
カレントディレクトリを変更するには、『os.chdir(変更後パス)』を使います。
>>> import os
>>> os.chdir('/home/work/Python')
>>> os.getcwd()
'/home/work/Python'
ディレクトリ直下にあるファイルとディレクトリをリスト形式で取得する(os.listdir(ファイルパス))
リスト形式でディレクトリ直下のファイル名とディレクトリ名を取得するには、『os.listdir(ファイルパス)』を使います。
>>> os.listdir('test')
['test.txt', 'test2.txt', 'testdir']
ファイル名やディレクトリ名をあいまい検索する(glob.glob(検索パターン))
ファイル名やディレクトリ名をあいまい検索するには、globモジュールを読み込んで『glob.glob(検索パターン)』を使います。検索バターンは全ての無数の値を意味する「*」や任意の一文字の数字を意味する「[0-9]」などを指定します。
>>> import glob
>>> glob.glob('*[0-9].*')
['test2.txt']
ファイルやディレクトリのプロパティ情報を参照する(os.stat(ファイルパス))
ファイルやディレクトリの最終アクセス時刻や所有者情報を参照するには、『os.stat(ファイルパス)』を使います。
>>> import time
>>> time.ctime(os.stat('test2.txt').st_mtime)
'Mon Nov 12 22:37:49 2018'
CSVデータを扱う
今までは文字列データの読み書きについて説明しましたが、実務ではCSVデータの読み書きを行うことが多いです。そこでここではCSVデータの読み書きについて説明します。CSVデータの読み書きも以下の手順を踏みます。
1.ファイルを開く
2.ファイルに対して読み書きをする
3.ファイルを閉じる
CSVファイルを開く(open(ファイルパス,モード))
CSVファイルの場合も『open(ファイルパス,モード)』で開きますが、モードには、バイナリモード(rb,wb.ab)を指定したほうが無難です。
>>> file = open('test.csv','rb')
CSVファイルを閉じる(close())
CSVファイルも閉じるには、『close()』を使います。
CSVデータを読み込む(csv.reader(ファイルハンドラ))
CSVデータを読み込むには、『csv.reader(ファイルハンドラ)』を使います。この関数はcsvモジュールにあるため、最初にimportする必要があります。
>>> import csv
>>> file = open('test.csv','rb')
>>> rd = csv.reader(file)
>>> for r in rd:
... print(r[0])
...
a
e
csv.readerはイテレータを返すため、サンプルのようにfor文を用いてlistから取り出します。
CSVデータを書き込む(csv.write(ファイルハンドラ))
一方、CSVデータを書き込むには、『csv.write(ファイルハンドラ)』を使います。
>>> import csv
>>> file = open('test.csv','wb')
>>> wt = csv.writer(file)
>>> wt.writerow([1,'java'])
>>> wt.writerow([2,'python'])
>>> file.close()
実際に書き込む関数は『ストリーム.writerow(リスト)』で書き込む事が出来ます。
まとめ
ファイルの読み書きには様々なモジュールを使います。最後にそれを表にまとめます。
分類 | 関数 | モジュール | ファイル/ディレクトリ |
ファイルを開く | open | なし(日本語ファイルはcodecs) | ファイル |
ファイルを読み込む | read,readline,readlines | なし | ファイル |
seek | なし | ファイル | |
ファイルに書き込む | write,writelines | なし | ファイル |
ファイルを閉じる | close | なし | ファイル |
パスを取得する | dirname | os.path | ディレクトリ |
basename | os.path | ファイル | |
abspath | os.path | ファイル | |
getcwd | os | – | |
パス操作 | join | os.path | – |
split | os.path | – | |
ファイル操作 | remove | os | ファイル |
copy | shutil | ファイル | |
ディレクトリ操作 | mkdir | os | ディレクトリ |
rmtree | shutil | ディレクトリ | |
copytree | shutil | ディレクトリ | |
listdir | os | ディレクトリ | |
ファイル・ディレクトリ共通操作 | rename | os | 共通 |
exists | os.path | 共通 | |
glob | glob | 共通 | |
stat | os | 共通 | |
その他 | chdir | os | – |
以上。