*始めに [#t8e9a620] データの保存や読み込みのため、Pythonでファイルを読み書きすることは良くあります。 しかし、PythonではCSVやデータベース、設定ファイルの読み書きなどを行うモジュールも充実しているため、慣れてくると直接ファイルを自分で読み書きすることはせず、そういったモジュールを使うことが多くなります。とはいえ、ファイル操作が全くしなくなることはありませんし、他のモジュールを理解するにも基本のファイル操作は知っておいた方が良いでしょう。 もしすでにファイル操作について知っていて、かつ対象とするファイルの形式が決まっている場合は以下を参考にするのをおすすめします。 -[[Python/設定ファイルの読み込み]] -[[Python/CSVファイルの読み込みと書き込み]] -[[Python/loggingを使ったログの出力]] -[[Python/SQLiteから使う基礎]] -[[Python/MySQLから使う基礎]] その他、「[[Python]]」を参照のこと。 *ファイルのオープンとクローズ [#mcbd9105] ファイルのオープンは「open」を使います。 この操作によって、今からどのファイルをどのようにあつかうかが決まり、そのファイルを表すオブジェクトが取得できます。 f = open("test.txt","r") 第一引数がファイル名、第二引数が読み込みモードです。第二引数は以下の値を取ります。 |読み込みモード名|意味| |r|読み込み専用| |w|書き込み専用| |a|追記| |r+|読み書き両方| |省略|読み込み専用(r)| この中でも特に「w」は元のファイルが消えて最初からファイルが作り直しになるので注意してください。 文字コード指定で開くには「codecs.open」を使います。 import codecs f = codecs.open('test01.txt', 'r','utf-8') こうすると読み込んだ文字列がunicode型になっています。 普通のopenだとstr型で読み込まれるため、それをunicodeに変換する手間が省けます(Python ver2系)。 ファイルのクローズは「close」を使います。 f.close() Pythonのプログラム自体が終了すると一緒にファイルもたいてい自動でクローズされます。しかし、ファイルを一度に開ける数には制限があります。ループの中などでcloseを忘れて大量にファイルを開くとエラーが発生することもあり、テストで少ないファイルを開いているときは大丈夫だったのに、いざ本番ではエラーになるといった、やっかいなバグの原因になることもあります。ファイルを使い終わったら習慣的に必ずcloseしましょう。 クローズしたファイルはまたオープンするまで使えません。クローズしたかどうかは「closed」で確認できます。 if f.closed: print "closed!" 例外が発生したりしても必ず自動でcloseしてくれる記法として、「with」を使う方法もあります。 with open('test.txt', 'r') as f: #何か処理 こちらの方が安全なので、積極的に使っていくと良いでしょう。 複数ファイルを開くときには with open('test01.txt', 'w') as f1, open('test02.txt','w') as f2: #何か処理 と列挙できます。しかし、オープンやクローズのタイミングをファイルによって変える必要があるときには、このように一つにまとめられないのでwithを使うとインデントが深くなって見にくくなってしまいます。 固定で数個のファイルを開くならwith、たくさんのファイルをあつかったり、個数が決まっていない場合はopen/closeを使うなどと使い分けをすると良いでしょう。 *ファイルの読み込み [#t9628561] テキストファイルを一行ずつ読み、表示するなら f = open('test01.txt', 'r') for l in f: print l f.close() となります。 この時、変数「l」には改行コードも含まれています。 そのため上の例ではprintの改行とあわせて空白行が出てしまいます。 それを取り除くには「strip」を使います。 for l in f: print l.strip() まとめて読み込みたい場合は「read」を使います。 以下の例ではファイルの内容をそのまま表示します。 f = open('test01.txt', 'r') print f.read() f.close() *ファイルの書き込み [#a748cee4] ファイルの書き込みにはwriteを使います。 以下の例では「テスト」という行がファイルの中で一行ずつ増えていきます。 # -*- coding: utf-8 -*- f = open('test01.txt', 'a') f.write("テスト\n") f.close() writelinesを使うと複数行をまとめて書くことも出来ます。 以下の例では「テスト0です」「テスト1です」というような行が10行追記されます。 # -*- coding: utf-8 -*- f = open('test01.txt', 'a') lines = [] for i in range(10): lines.append("テスト%dです\n" % i) f.writelines(lines) f.close() *終わりに [#k383a515] ここではテキストファイルを中心としたPythonでのファイルの読み書きをご紹介しましたが、Pythonではバイナリファイルなどもほぼ同様にして扱えます。しかし、少し工夫が必要で、また大量のバイナリデータを扱うなどの場合はCやC++といった言語を使った方が処理が速いので良いかも知れません。 データの量が多くなったり、データ構造が複雑な場合は最初に書いたようになるべく他のモジュールと組み合わせるのがおすすめです。 独自形式のファイルなどを作ろうとすると、意外に大変です。学習を目的としているので無ければ、少なくとも個人レベルでは避けた方が無難です。