この章ではファイルを読み書きする方法について説明します。
Pythonではプログラムでファイルを作成したり、ファイルの読み書きをすることが出来ます。
初めにファイルの中身を読み込む方法について説明します。
pyファイルの他に「test.txt」を用意します。
ファイル名は自由に付けていただいて結構です。
では例をみてみましょう。
結果は次の通りです。
ファイルを開くにはopen関数が必要です。
「モード」にはファイルをどのような状態で開くのかを指定します。
例えば「r」ですと、読み込み専用で開きます。
例では「test.txt」の中身を読み込みたいので、モードは「r」にしています。
モードは他にも以下の種類があります。





次にファイルの内容の読み込み方法について説明します。
ファイルの内容を読み込むためのメソッドは3種類あります。

例ではreadメソッドを使っていますが、このメソッドはファイルのすべての内容を読み込むので、
で読み込んだ内容を変数dに入れて、
で出力しますと「test.txt」の内容が出力されます。
そして、ファイルを開いたら、閉じなくてはいけないので、close関数で閉じます。
次はreadlinesメソッドを使って、ファイルを読み込む方法について説明します。
readlinesメソッドはファイルの内容すべてをリストとして返すので、
で出力すると
になります。
ファイルの行の終端には改行文字が付いているので、for文で出力する時には以下のように改行されて出力されます。
この改行文字を取り除きたいのであればstripメソッドを使用します。
このstripメソッドは文字列の前や後の改行文字や空白、タブなどを取り除いてくれます。
先ほどの例をstripメソッドを使って書き直すと以下の通りです。
結果は以下の通り、改行文字が取れていることが分かります。
次はreadlineメソッドを使ってファイルの内容を改行文字までの1行を読み込み、文字列を出力します。
readlineメソッドはファイルの内容を改行文字までの1行を読み込みます。
結果は次の通りです。
次はファイルへ書き込む方法について説明します。
指定ファイルに文字列を書き込むにはモードを
で指定します。
ファイルに書き込むにはwriteメソッドの引数に文字列を指定してください。
ファイルの中で改行したい場合は
のように改行文字を使用します。
この例ではモードに「w」を指定しているので、ファイルの中身をカラにして書き込みます。
結果は以下のように「test.txt」が書き替えられます。
もう一つファイルに書き込むメソッドがありますので、次の例で説明します。
ファイルに書き込むにはwritelinesメソッドの引数に文字列、リスト、タプルなどを指定してください。
writeメソッドの引数にリスト、タプルを指定するとエラーになります。
結果は以下の通り「test.txt」が書き替えられます。
タグ: readLine
IOクラスについて知ろう
この章ではIO クラスとファイルの入出力について説明します。
ファイルの入出力の基本はファイルを開いて、ファイルに書き込んだり、ファイルから読み込んだりして、最後にファイルを閉じます。
ファイルの入出力にはIO クラスのオブジェクト(IO オブジェクト)を使用します。
ではIO クラスを使用して、ファイルを操作する方法について説明します。
ファイルを開いたり閉じたりする方法は2つあります。
構文の中のアクセスモードとは「ファイルを読み込み用で開くのか」、「書き込み用で開くのか」、「読み書き両方で開くのか」を文字列で指定したものです。



「ファイル操作の手順の2」のファイルに書き込んだり、ファイルから読み込んだりするには次の表のメソッドを使用します。
以下のメソッドを使って、入力したり、出力したりします。



では次の例で「test.dat」からデータを読み込んでみましょう。
初めにファイルを開きますが、この例では先ほどの基本構文 2でファイルを開いています。
アクセスモードは読み込み専用の
を使用しています。
「オブジェクト.gets 」と言う形式でファイルからデータを読み込むことができます。
getsメソッドはファイルの中の1行分を読み込むことが出来ますので、「abcde」だけを読み込み、ファイルの終わり(EOF)になるとnilを返します。
最後に
という形式でファイルを閉じます。
基本構文2でファイルを開いた場合にはcloseメソッドは省略できます。
先ほどの例では1行しか取り出さないので、すべての要素を取り出したい場合はwhileを使用します。
次の例のようにwhileを使うと「abcde」「efgh」のすべてが取り出せます。
「a.gets」で取り出されたデータがbに入り、それをprintで出力しています。
次の例をみてみましょう。
readlineメソッドもgetsと同じでファイルの中の1行分だけ読み込むことが出来ます。
基本構文は
です。
次の例をみてみましょう。
と言う形式で、ファイルのすべての行を配列(この例ではb)に格納してくれます。
それを eachメソッド で繰り返し取り出しています。
結果は以下の通りです。
次の例をみてみましょう。
「IOオブジェクト.getc 」という形式でファイルから1文字ずつ読み込みます。
このメソッドはファイルの終わり(EOF)になるとnilを返します。
次の例をみてみましょう。
基本構文は
です。
ファイルの初めから終わりまでを読み込んで出力します。
ファイルの終端に達するとnil を返します。
次は
という構文でサイズを入力し、そのサイズ分だけファイルからデータを取り出します。
この例では2バイト分だけ読み込んでいるので、結果は「ab」です。
次の例をみてみましょう。
と言う基本構文でファイルの中身をすべて読み込むことが出来ます。
次はファイルに書き込むメソッドについて説明します。
では例をみてみましょう。
=>
と言う形式でファイルに改行を入れて書き込むことが出来ます。
これでt.datに「abcdef」「aiueo」が改行を入れて書き込まれます。
次の例をみてみましょう。
と言う形式でファイルに改行を入れないで書き込むことが出来ます。
結果はte.datに「abcdefaiueo」のように改行を入れないで書き込まれました。
次の例をみてみましょう。
と言う形式でファイルに改行を入れないで書き込むことが出来ます。
結果はt.datに「abcdefaiueo」のように改行を入れないで書き込まれました。
writeメソッドを使って、改行を入れて書き込みたい場合には以下の通り、
を入れます。
次の例をみてみましょう。
と言う形式でファイルに書き込むことが出来ます。
結果はte.datに「abcdefaiueo」のように改行を入れないで書き込まれました。
次はファイルポインタについて説明します。
ファイルのデータを読み書きするには「ここまで読んだから次はここから読む」もしくは「ここまで書いたから次はここから書く」のように位置を覚えておかなくてはいけませんが、プログラマ自身が覚えている必要はなく、ファイルポインタと言う位置情報にこのデータが記録されています。
次の例をみてみましょう。
「IOオブジェクト.pos」と言う形式で、現在のファイル位置を得ることが出来ます。
2バイト読み込んだので、現在のファイルの位置は2の箇所にあります。
例の実行結果は「ab」と「2」を出力します。
またposは現在の位置を知るだけでは無くて、任意の位置に移動することが出来ますので次の例で説明します。
移動したい場合は
と記述します。
「i.pos=5」は5バイトだけ移動します。
5バイトで出力すると「fgh」を出力します。
「i.pos=0」は先頭まで移動します。先頭まで移動したので「abcdefgh」を出力します。
次はファイルポインタを移動するseekメソッドについて説明します
では例をみてみましょう。
で、ファイルポインタを自由に移動させることができます。
第 2引数のwhenceには以下の3種類から選択して、ファイルポインタの動きを決めることが出来ます。
では例の説明をします。
「i.read(2)」で2のサイズだけ動いていて、その後に
でさらに5のサイズだけ移動しているので
で現在の位置を見ると7になります。
7進んだ位置で出力すると「h」を出力します。
のように
に変更したとしますと、これは絶対位置なので
で現在の位置を見ると5になります。
次はrewindメソッドについて説明します。
rewindメソッドはファイルポインタを先頭に戻します。
では例をみてみましょう。

と言う形式でファイルポインタを先頭に戻します。
puts i.posで出力すると0が出力されます。
ファイルの入出力について知ろう
この章ではファイルの入出力について学びます。
以下の例は「java.txt」のすべての内容を取り出しています。

コンパイルをした後に以下のようにコマンドプロンプトにファイル名を入力して、エンターキーを押すと「java.txt」の内容が出力されます。

ではファイルからデータを取り出すプログラムの説明をします。
=> FileReaderクラスを使いますので、この
をインポートしてください。
次の箇所の説明をします。
=>入力値が適切かどうかをチェックしています。
「args.length != 1」は配列の数が1でなければ「間違い」が出力されます。
つまり以下のように1つ以上入力があると「間違い」が出力されるという意味です。![]()
次は以下の箇所の説明をします。
System.exit(0);
=> System.exit()はプログラムが正常に終了することを意味します。
次は以下の箇所の説明をします。
=> FileReaderクラスはファイルからデータを読み込むためのクラスです。
FileReaderクラスはBufferedReaderクラスの引数に入っていますが、BufferedReaderクラスの引数に入れることにより、ファイルの読み込みが早くなります。
次は以下の箇所の説明をします。
=> readLine()はファイルからデータを読み込むためのメソッドです。
BufferedReaderクラスにはどのようなメソッドがあるかはJavaTM Platform Standard Edition 6の中でBufferedReaderを検索しますと以下のメソッドが使えることが分かります。
つまり、
の箇所はreadLineメソッドで読み込んだものがlnに入って、それとnullを比べています。
readLineメソッドはファイルを最後まで読み終えたら,null という値を返します。
nullは値がない状態を意味します。
ですのでファイルの終端に達していない限り、whileですべてのデータを取り出すことが出来ます。
次は以下の箇所の説明をします。
rd.close();
=>最後に
という形式で閉じます。
次は以下の箇所の説明をします。
=>JavaTM Platform Standard Edition 6でFileReaderを検索していただくと以下の内容が表示されるのですが、
という箇所を見てください。
これはこのFileReaderクラスがFileNotFoundExceptionという例外を発生させる可能性があることを意味しますので、必ず
を入れてください。
次はファイルからデータを読み込むメソッドをreadLineメソッドからreadメソッドに変更して出力します。

では説明を始めます。
=> FileReaderクラスのオブジェクトを作成します。
FileReaderクラスの引数はファイル名になります。
次は以下の箇所の説明をします。
=>readメソッドはファイルの先頭から1文字を読み込みます。
この例ではwhileで回しているのでファイルの先頭から順番に1文字ずつファイルを読み込みます。
そして、ファイルの終端に達したならば「-1」を返します。
readメソッドはファイルの初めから1文字を読み込みますと言いましたがreadメソッドの戻り値はint型の整数になります。
この整数は文字コードを表す整数ですので、これを
でキャストして「文字」に変換します。
「char()」でキャストしないと以下のように整数の連続になり文字にはなりません。
「char()」でキャストすると以下のように文字になって出力されます。
次は指定したファイルへの書き込みについて説明します。
以下の通り、書き込みたいファイルを指定してください。
ファイルに書き込みをするためにはFileWriterクラスを使用します。
FileWriterクラスの引数はファイル名になります。
=>ここではwriteメソッドでファイルへの書き込みを行います。
filew.close();
=>closeメソッドでファイルを閉じます。
FileWriterクラスの例外はIOExceptionですので、これをcatchの引数に入れてください。
次はファイルの削除方法について説明します。
では説明を始めます。
Fileクラスはファイルやディレクトリの作成などに関するクラスです。
ファイルを削除するにはFileクラスのdeleteメソッドを使うので引数に削除したいファイルを指定します。
Fileクラスのメソッドはたくさんありますが、以下にその一部を載せます。
初めにコンパイルしましたら、以下のようにファイル名を入力してください。
入力したファイル名は
に入ります。
その後,if文で
を判定するのですが、deleteメソッドは削除できたらtrueを、削除できなかったらfalseを返します。
if文で星座を判定しよう
この章ではif文で星座の判定を書いてみましょう。
ユーザーに誕生月と誕生日を入力させて、それに対して星座を出力するプログラムです。
ここで使っているif文は入れ子になっています。
つまり、if文の中にif文が入っている構造になっています。
また、ユーザーに入力させるにはBufferedReaderクラスを使うのですが、BufferedReaderクラスの説明は「キーボードの入力の値を受け取ろう」の章で説明します。
では例をみてみましょう。
少し長いですが、if文が繋がっているだけです。













この章はif文の学習なのでBufferedReaderクラスやreadLineについては理解しなくても結構です。
BufferedReaderクラスについては「キーボードの入力の値を受け取ろう」の章で説明します。
ユーザーに入力してもらう仕組みは以下のBufferedReaderクラスが行います。
紙面の都合で2行で書いていますが、1行で書いても結構です。
さらにBufferedReaderクラスを使用するためにはブログラムの冒頭に
と書きます。
importは他のファイルを取り込む時に使用します。
では次の箇所の説明をしますが、この章はifの学習ですので、この時点で理解する必要はありません。
=>この箇所はユーザーが入力したものをlineに代入しています。
つまり、この箇所でプログラムが入力待ちの状態になるので、好きな数値を入力します。
例えば以下の通り、1と、入力しますとこの1がlineに代入されます。
readLineは1行のテキストを読み込むという意味になります。
では次の箇所の説明をします。
=>この箇所はキーボードから入力したデータをint型の整数値に変換しています。
先ほど1という数値を入力したのに、なぜまたint型整数に変換しているのかというと、コマンドプロンプトで入力したのは実際には数値ではなく、
という形式の文字列です。
ですので、この文字列を整数値に変換する必要があるのです。
int型の整数値に変換する方法は以下の通りです(これらはクラスやメソッドといわれるものを使用しているので、今は分からなくても結構ですが、構文は覚えておいてください)。
この例では2か所でreadLineを使って、誕生日の日と月を入力させています。
ではif文の説明に入ります。
これからif文の入れ子について説明します。
この例では外側のif文でmonthの数値が1から12までのどの数値なのかを確認します。
次に内側のif文で入力させたdayの値により分別をします。
例えば1月は山羊座か水瓶座なので,1月19日までが山羊座で、1月20日からが水瓶座になります。
ですので、入れ子の中の条件式は「&&」で連結して、
という表現で書きます。
どれにも当てはまらない時には「間違い」が出力されます。
このように内側のif文は外側のif文での条件をさらに絞りたい場合に使用します。
つまり、入力された月は1月なので、さらに入力された日をもとに山羊座か水瓶座のどちらかを調べましょうと言うことです。
次は以下の説明ですが、この箇所は「例外処理について知ろう」の章で説明しますので、ここではわからなくて結構です。
簡単に説明しますと、ここは例外処理と呼ばれるものです。
つまり、この例では数字以外のものが入力されたら
と出力されます。
例外処理は文字通り、数値以外のものが入力されたなどの予想以外の動作が行われた際の処理です。
今は例外処理を分からなくてもいいですが、構文を書いておきます。
詳しくは「例外処理について知ろう」の章で説明します。
これで星座判定の説明は終わりますが、
結果は例えば以下のように表示されます。
