python学習記録7 分岐、ループ
「1時間で覚えるPython」が終わったので、今日は下記のサイトで学習しました。
Python 早めぐり
http://www.shido.info/py/python2.html
今日は「1.起動方法」から「4.ブロック」の途中まで学習しました
学習したこと
分岐にはif-elif-elseを使う
ループにはwhile, forを使う
10回繰り返す場合は下記のように書く
for x in xrange(10):
xには0から9までの値が入る
配列を番号付きで取り出すにはenumerate()メソッドを使う
list = ['aaa', 'bbb', 'ccc'] for i, a in enumerate(list):
iに0からの数字、aに配列の内容が入る
辞書のキーと値を同時に取り出すにはiteritems()メソッドを使う
aaa = {'key1': 'value1', 'key2': 'value2'} for k, v in aaa.iteritems():
kにはキー, vには値が入る
複数の配列を同時にループするにはzip()メソッドを使う
list1 = ['aaa', 'bbb', 'ccc'] list2 = ['ddd', 'eee', 'fff'] for a, b in zip(list1, list2):
aにlist1, bにlist2がそれぞれ先頭から代入されてループする
python学習記録6 入出力
引き続き下記のサイトでpythonを学習しました。
1時間で覚えるPython
http://kanaya.naist.jp/nishio/LearnPythonInAnHour.html
今日は「ファイル入出力」のところを学習しました
学習したこと
- ファイルの入出力にはfile()関数を使う
fo=file(r"/var/tmp/output.txt", "w") for line in file(r"/var/tmp/imput.txt"): fo.write(line) fo.close()
-
- python2.2で新しく追加された関数でそれ以前はopen()だった。
- file()の使い方は下記参照
- f=file("ファイル名",モード) でファイルオブジェクトを作る
- モードはr(読み出し), w(書き込み), a(追記)を指定する。省略した場合はrになる
- ファイルオブジェクトに対し下記のような操作ができる
- f.read()でファイル全体を読み込む
- f.realine()でファイルを一行ずつ読み込む
- f.readlines()でファイル全体を読み込み、各行をリストにする
- f.write('文字列\n')で文字列を書き込む
python学習記録5 正規表現
引き続きで下記のサイトでpythonを学習しました。
1時間で覚えるPython
http://kanaya.naist.jp/nishio/LearnPythonInAnHour.html
今日は「正規表現」のところを学習しました
学習したこと
re.search("正規表現", "検索する文字列")
- でもコンパイルした方が無駄がなくなる
rexp=re.compile("正規表現") print rexp.search("検索する文字列")
- マッチするとマッチオブジェクトというものが返される
- そのオブジェクトに対し各種メソッドを使うことで下記の各種操作ができる
- start : マッチした部分の開始位置
- span : マッチした範囲
- group : マッチした文字列
python学習記録4 クラス
今日は昨日の続きでクラスについて学習しました
オライリーの『初めてのPython』のクラスのところを読みましたが、
オブジェクト指向について少し分かってきました。
クラスとインスタンスというものがあり、
クラスはインスタンスのひな形で、関数などの共通部分を定義するもので、
インスタンスはクラスを元に生成し、それぞれのインスタンスに固有のデータを持つものだということがわかりました。
下記のプログラムを作成し、実際に動かしてみました
#!/usr/bin/env python # クラスC1を定義 class C1: # クラスのメソッド(関数)を定義 # selfにはインスタンスが入る def setname(self, who): self.name = who # インスタンスI1,I2を生成 I1 = C1() I2 = C1() # インスタンスのメソッドを呼び出す # aaa, bbbはwhoに代入される I1.setname('aaa') I2.setname('bbb') # インスタンスの変数を表示 print I1.name
$ python test1.py
aaaと表示される
#!/usr/bin/env python # クラスC1を定義 class C1: def __init__(self, who): self.name = who # インスタンスI1,I2を生成し、コンストラクタ__init__を実行 I1 = C1('aaa') I2 = C1('bbb') # インスタンスの変数を表示 print I1.name
__init__はコンストラクタというものでインスタンスを定義すると同時に実行される関数
$ python test2.py
aaaと表示される
ただ、実際の業務ではインフラのスクリプトでクラスを使用しているものをあまり見たことが無いです
どういうときに使うと良いかというのがまだわかっていません。
引き続き学習したいと思います。
python学習記録3 クラス
今日は昨日の続きで下記のサイトでpythonを学習しました。
1時間で覚えるPython
http://kanaya.naist.jp/nishio/LearnPythonInAnHour.html
「制御構造」から「関数、クラスの定義」の途中までやりました。
しかし、「関数、クラスの定義」というところでつまづきました。
オブジェクト指向は、昔、新卒研修の時に時にやったきりで、
クラスとかメソッドとかそもそもよく概念がわかりません。
下記のページも見てみましたが、
pythonでのクラスの使い方がまだよくわかっていないので、
明日も引き続き学習したいと思います。
Piz&Yuminaのプログラミング勉強ノートの[Python]Pythonのクラス(1)
http://blogs.wankuma.com/pizyumi/archive/2008/06/01/140593.aspx
python学習記録2
pythonの学習記録1
今はシェルスクリプトしか使えないのですが、サーバーエンジニアとして仕事の幅を広げたいため、今日からpythonを学習したいと思います
環境
- CentOS5.4
- python-2.4.3-27
処理の流れ
- 引数で入力ファイル名、一時ファイル名、置き換える内容を記載したファイル名を指定
- 入力ファイルを日付つき(.YYYYMMDD)でバックアップ
- 入力ファイルを一行ずつ読み込み
- ddddと一致したら置き換える内容を記載したファイルの内容を一時ファイルに書き込む
- 一致しない場合は入力ファイルの内容をそのまま書き込む
- 入力ファイルと一時ファイルの差分を表示する
- 一時ファイルを入力ファイルに上書きして良いか確認するよう表示し、入力を待つ
- 確認に「y」が入力された場合一時ファイルを入力ファイルに上書きする
作成したスクリプト
#!/usr/bin/python import sys import datetime import shutil import difflib import re src_file = sys.argv[1] tmp_file = sys.argv[2] add_file = sys.argv[3] bk_file = src_file + "." + datetime.date.today().strftime("%Y%m%d") ## Backup shutil.copy(src_file, bk_file) ## Modify pattern = re.compile('dddd') f1 = open(src_file, 'r') f2 = open(tmp_file, 'w') f3 = open(add_file, 'r') while 1: s = f1.readline() if not s: break if pattern.match(s): add_list = f3.readlines() for add in add_list: f2.write(add) else: f2.write(s) f1.close() f2.close() ## Diff f1 = open(src_file, 'r') f2 = open(tmp_file, 'r') a = f1.readlines() b = f2.readlines() for buf in difflib.context_diff(a, b,n=0): print buf f1.close() f2.close() ## Confirm user_input = raw_input("Ovewrite?(y/n)") ## Overwrite if user_input == "y": print "Copy " + tmp_file + " To " + src_file shutil.copy(tmp_file, src_file) sys.exit(0) else: sys.exit(1)