ファイル入出力

例によって ~/python/lesson10 で練習すること.

UNIX コマンドでファイルを作ったりコピーしたり削除したりしたが、 Python でもプログラムでファイルの読み書きができる。 ファイルの内容をプログラムで読み込むには、ファイルを「読み取りモード」 で開いて、read() や readline() の関数を使う。読み取りが終了したファイルは 閉じる。(Python 終了時に開いているファイルは自動的に閉じられる。)
例: read() でファイルの中身を全部読み取る

>>> f = open('/etc/motd', 'r')
>>> s = f.read()
>>> s
'Sun Microsystems Inc.\tSunOS 5.8\tGeneric\tFebruary 2000\n'
>>> f.close()
1行ずつ読み取るには readline() を使う。
>>> f = open('/etc/hosts', 'r')
>>> s = f.readline()
>>> s
'#\n'
>>> s = f.readline()
>>> s
'# Internet host table\n'
>>> f.close()
また、ファイルを新たに作成して文字列を書き込むには、「書き込みモード」 で開いたファイルに write('文字列')で書き込み、最後にファイルを閉じる。
>>> fw = open('aaa', 'w')
>>> fw.write('Hello, File!\n')
>>> fw.close()
>>> ^D
tkikuchi@fms% cat aaa
Hello, File!
次のプログラムでファイルの入出力を試してみよう。
#!/bin/env python
# pfile.py
# print a file (ファイルの中身を画面に出力する)

import sys

fname = sys.argv[1]
# ファイルを読み出しモードで開く
f = open(fname, 'r')
while 1:
    # 一行読み込む
    s = f.readline()
    if not s:
        # ファイルの終わりを検出
        break
    # 標準出力に書き出す
    sys.stdout.write(s)
f.close()
ここでは、画面に出力するのに print でなく、sys.stdout.write() を使っていることに注意。sys.stdout は標準出力のファイルオブジェクト である。readline() で読み取った文字列には最後に '\n' (改行) が 付いているので、自動的に改行を加える print でなく、write() を 使っている。

次の例は、UNIX の cp コマンドをまねたものである。

#!/bin/env python
# cp.py
# cp コマンドを python で作る
# 書式:cp.py file1 file2
import sys

# ファイルを読み出しモードで開く
f1 = open(sys.argv[1], 'r')
# コピー先のファイルを書き込みモードで開く
f2 = open(sys.argv[2], 'w')
while 1:
    # 一行読み込む
    s = f1.readline()
    if not s:
        # ファイルの終わりを検出
        break
    # 出力に書き出す
    f2.write(s)
f1.close()
f2.close()
次のようなデータをファイル(fortune.dat) に作成しておくと、 その下のプログラムを実行することでデータがディクショナリに読み込まれる ことを確かめよう。(但し、空白文字は半角であることに注意)
いちご    幸運が訪れます
みかん    努力が必要です
りんご    危険がいっぱいです
プログラム
#!/bin/env python
# fortune.py
# fortune.dat を読み取るプログラムの例
f = open('fortune.dat', 'r')
fortune = {}
while 1:
    s = f.readline()
    if not s:
        break
    key, value = s.split()
    fortune[key] = value
f.close()
for key in fortune.keys():
    print key, fortune[key]

問題

  1. 第9回のichigo.py を改造して、占い文を fortune.dat から取り出すように した ichigo3.py を作成しなさい。
  2. さらに、第9回の問題のように占い文を変更する場合を考えて、プログラムの終了時に 変更された占い文を fortune.dat に保存できるようにしなさい。 次の実行例を参考にすること。
    tkikuchi@fms% ./ichigo4.py
    *** いちご占い ***
    好きなフルーツの名前をどうぞ: りんご
    *** りんごの好きなあなたには危険がいっぱいです.
    もし、この占いが気に入らなかったら x を入れてください: x
    りんごのことは忘れました.
    好きなフルーツの名前をどうぞ: りんご
    りんごのことはよく知りません.
    教えてください: チェックが似合います
    わかりました. 次に聞かれたときは、
       りんごの好きなあなたにはチェックが似合います.
    と、答えます.
    好きなフルーツの名前をどうぞ: りんご
    *** りんごの好きなあなたにはチェックが似合います.
    もし、この占いが気に入らなかったら x を入れてください:
    好きなフルーツの名前をどうぞ:
    *** いちご占いを終了します
    新しい占い文を保存するには y を入れてください: y
    保存しました
    *** さようなら ***
    tkikuchi@fms% cat fortune.dat
    いちご    幸運が訪れます
    みかん    努力が必要です
    りんご    チェックが似合います
    
解答は、メールで送ってください。