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()
  • 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の基本的なことが理解できていないので下記のサイトを参考に基本から毎日少しずつ学習していくことにしました

Python入門サイトのまとめ

今日は上のまとめページに載っていた「1時間で覚える?Python」の「動かしてみる」から「基本的なデータ型とそのメソッド」までを学習しました。

「1時間で覚える?Python
http://kanaya.naist.jp/nishio/LearnPythonInAnHour.html

例に載っているプログラムと同じものをコピペでなく手で打ち込んでみて動かし、
同じ結果になることを確認しました。

引き続き頑張ります

pythonの学習記録1

今はシェルスクリプトしか使えないのですが、サーバーエンジニアとして仕事の幅を広げたいため、今日からpythonを学習したいと思います

環境

練習で作成するスクリプト

下記のテキストの「dddd」を「abcd」,「efgh」の2行に置換するスクリプト

aaaa
bbbb
cccc
dddd
eeee

処理の流れ

  • 引数で入力ファイル名、一時ファイル名、置き換える内容を記載したファイル名を指定
  • 入力ファイルを日付つき(.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)