Views
ファイルの処理
~/python/13 で...
はじめに
- この授業の前半では、UNIX コマンドでファイルを作ったりコピーしたり削除したりしました。
- Python を使ったプログラムでも open() を使って、ファイルの読み書きができます。
- ファイルの内容をプログラムで読み込むには、ファイルを「読み取りモード」で開いて、read() や readline() の関数を使います。
- 読み取りが終了したファイルは close() で閉じます。(Python 終了時に開いているファイルは自動的に閉じられます。)
例
- read() はファイルの中身を全部読み取ります
>>> f = open('/etc/motd') >>> s = f.read() >>> s 'Welcome to Darwin!\n' >>> f.close()
例(contd.)
- 1行ずつ読み取るには readline() います。
>>> f = open('/etc/hosts') >>> f.readline() '##\n' >>> f.readline() '# Host Database\n' >>> f.close()
ファイルに書き込む
- ファイルを新たに作成して文字列を書き込むには、
- 「書き込みモード」で開いたファイルに
- write('文字列')で書き込み、
- 最後にファイルを閉じます。
書き込みの例
>>> fw = open('aaa', 'w') >>> fw.write('Hello, File!\n') >>> fw.close() >>> ^D $ ls aaa $ cat aaa Hello, File!
プログラム例
#!/usr/bin/env python # -*- coding: utf-8 -*- # a.py # ファイルの中身を画面に出力する import sys fname = sys.argv[1] # ファイルを読み出しモードで開く f = open(fname) while 1: # 一行読み込む s = f.readline() if not s: # ファイルの終わりを検出 break # 標準出力に書き出す sys.stdout.write(s) f.close()
実行例
- a.py を使って,先ほど作った aaa を画面に出してみましょう。
$ ./a.py aaa Hello, File!
- 練習:a.py で a.py を画面に出してみましょう。
補足
- ここでは、画面に出力するのに print でなく、sys.stdout.write() を使っていることに注意してください。
- sys.stdout は標準出力のファイルオブジェクトです。
- readline() で読み取った文字列には最後に
\n
(改行) が付いているので、自動的に改行を加える print でなく、write() を使っています。
プログラム例(その2)
- 次の例は、UNIX の cp コマンドをまねています。
#!/usr/bin/env python # -*- coding: utf-8 -*- # b.py # cp コマンドを python で作る # 書式:b.py file1 file2 import sys # ファイルを読み出しモードで開く f1 = open(sys.argv[1]) # コピー先のファイルを書き込みモードで開く f2 = open(sys.argv[2], 'w') while 1: # 一行読み込む s = f1.readline() if not s: # ファイルの終わりを検出 break # 出力に書き出す f2.write(s) f1.close() f2.close()
実行例
- b.py を使って aaa を bbb にコピーしてみます。
$ ./b.py aaa bbb $ ls a.py aaa b.py bbb $ cat bbb Hello, File!
プログラム例(その3)
- 次のようなデータをファイル(fortune.dat) に作成しておくと、その次のプログラムを実行することでデータがディクショナリに読み込まれることを確かめましょう。
- 但し、空白文字は半角であることに注意してください
- ファイル fortune.dat
いちご 幸運が訪れます みかん 努力が必要です りんご 我慢が必要です
プログラム
#!/usr/bin/env python # -*- coding: utf-8 -*- # c.py # fortune.dat を読み取るプログラムの例 f = open('fortune.dat') fortune = {} while 1: s = f.readline().strip() if not s: break key, value = s.split() fortune[key] = value f.close() for key in fortune.keys(): print key, fortune[key]
問題1
- 第12回のa.py を改造して、占い文を fortune.dat から取り出すようにしなさい。(q1.py という名前で作成)
問題2
- 第12回の q1.py を改造して、占い文を fortune.dat から取り出し、新しい占い文を追加し、終了時にその占い文を保存するようにしなさい。これができると、以下の実行例のように次回の実行時にも新しい占い文を利用することができる。
$ ./q2.py *** いちご占い *** 好きなフルーツの名前をどうぞ: ばなな ばななのことは知りません。教えてください: 忍耐が必要です 好きなフルーツの名前をどうぞ: ********* さようなら ********* $ ./q2.py *** いちご占い *** 好きなフルーツの名前をどうぞ: ばなな ばななの好きなあなたには忍耐が必要です. 好きなフルーツの名前をどうぞ: ********* さようなら *********
解答は、"メール":mailto:tkikuchi+ci2006@is.kochi-u.ac.jp?subject=13_File で送ってください。
また,今回の演習の結果できたファイルはそのまま ~/python/13 に残しておいてください。評価の対象とします。