例1: 1行に一つずつ数字データの入ったファイルを読んでその数字の合計を計算する。ファイルから入力した行を 1行ずつ処理し、ファイルの終わりで終了するには、 while 1: の無限ループから if not s: break のようにして抜け出るとよい。
#!/pub/sol8/bin/python
# sum3.py
import string
import sys
def sum3(fname):
fp = open(fname, 'r')
sum = 0
while 1:
s = fp.readline()
if not s:
break
print s,
d = string.atoi(s)
sum = sum + d
fp.close()
print '合計 = %d' % sum
if __name__ == '__main__':
sum3(sys.argv[1])
|
例2: 0から89度までの sin の値を arc.datという名前のファイルに入れる。
#!/pub/sol8/bin/python
# sintable.py
import math
fp = open('arc.dat','w')
for i in range(90):
s = math.sin(math.pi * i / 180.0)
fp.write('%2d %10.8g\n' % (i, s))
fp.close()
|
例3: ファイルをコピーする。一度に読み込むには read()を使う。
#!/pub/sol8/bin/python
# copy.py
import sys
def copy(fname1, fname2):
fp1 = open(fname1, 'r')
fp2 = open(fname2, 'w')
fp2.write(fp1.read())
fp1.close()
fp2.close()
if __name__ == '__main__':
copy(sys.argv[1], sys.argv[2])
|
例4: grep と awk の練習問題 5 を Python で書いたもの。
#!/pub/sol8/bin/python
# topten.py
def topten(fname):
fp = open(fname)
# ユーザ名: アクセスカウンタ のディクショナリを作る
access = {}
while 1:
s = fp.readline()
if not s:
break
t = s.split() # 文字列を空白で区切ってリストにする
if access.has_key(t[2]):
access[t[2]] += 1 # 3番目のフィールド(ユーザ名)をキーに
# カウンタに1を加える.
else:
access[t[2]] = 1 # キーが無いので作る
# アクセスカウント: ユーザ名リスト のディクショナリを作る
ranking = {}
for i in access.keys():
if ranking.has_key(access[i]):
ranking[access[i]].append(i) # 同じカウントのところに
# ユーザ名を追加
else:
ranking[access[i]] = [i]
k = ranking.keys()
k.sort() # カウンタ値を並べ替え
k.reverse() # 降順にする
for count in k[:10]:
print '%3d %s' % (count, ranking[count])
if __name__ == '__main__':
topten('../TX.log')
|
上記の topten.py では基本的な順位作成まではできるが、いくつかの点で常用するプログラムとしては不十分な点がある。以下にそのいくつかを挙げるので、topten.py を改良して top.py というファイル名にして保存しなさい。
tws.is.kochi-u.ac.jp - tkikuchi@is.kochi-u.ac.jp [21/Oct/2002:15:46:47 +0900] "GET /TX/register/ HTTP/1.0" 200 359のように、最後から二つ目のフィールドが '200' になっている。これを利用して、正しい ユーザのものだけを取り出す。
<a href="http://www.is.kochi-u.ac.jp/~tkikuchi/>菊地のホームページ