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