パイソンPython 入門、学習if文 for文、クラス継承、List型、文字列置換、正規表現、ファイル入出力

パイソンPython 入門、学習

Python is powerful… and fast;
https://www.python.org/

学習内容 if文 for文 

if文 if,elif,else 中括弧は要りません
for文 for in 、for(int i=0; i< 10; i++)はない rangeを使う

特徴
[note]ガベージコレクションがあり、コードの記載はインデント規則を守ること(自由に変則的な書き方はできない、tabなし、改行なしで続けて書くことはできない等)[/note]

動画

# coding:utf-8
# 2バイト文字を使う場合

#if
if __name__ == "__main__":
	value=2
	if value ==1 :
		print "1です"
	elif value ==2 :
		print "2です"
		#pass
	else:
		print "ありません"
	
	x=range(4)
	for a in x:
		print a
	
	for a in range(10,13):
		print a
		
	for a in range(0,6,2):
		print a
	
	a = [1,2,3,4]
	for c in range(len(a)):
		print c, a[c]
		
	a = [1,2,3,4]	
	for c,var in enumerate(a):
		print c, var

参考サイト

python-izm
Kura IT LAB

パイソンPython 入門(2)、学習 関数、クラス プログラム

学習内容
関数 def
クラス class
インスタンス (instance) を生成
def __init__ 初期化、コンストラクタ

# coding:utf-8


# class
class animal:
	def __init__(self,syurui):
		self.syurui = syurui

class Dog:
	tricks = []
	def __init__(self,name):
		self.name = name
	def add_trick(self,trick):
		self.tricks.append(trick)
		
# func
def test():
	print "test func"
	
def hoge(width,height,num=3):
	print width + height
	print num



if __name__ == "__main__":
	x = animal("cow")
	print x.syurui
	print "-----"
	d= Dog("taro")
	e= Dog("ai")
	
	print "name="+d.name
	print "name="+e.name
	
	d.add_trick("test")
	e.add_trick("hoge")
	print d.tricks
	
	print "-----"
	test()
	hoge(100,100)

上記のコードはtricksがグローバル変数です。
今度は、インスタンス変数としてクラスの新しいインスタンス毎に個別の配列を持つように書き換えました。

# coding:utf-8


# class
class animal:
	def __init__(self,syurui):
		self.syurui = syurui

class Dog:
	tricks = [] #グローバル変数
	def __init__(self,name):
		self.name = name
		self.aList = [] #add  インスタンス変数として配列を作成することで、クラスの新しいインスタンス毎に個別の配列を持ちます。
	def add_trick(self,trick):
		self.tricks.append(trick)
	def add_list(self,a):  #add
		self.aList.append(a)  #add

		
# func
def test():
	print "test func"
	
def hoge(width,height,num=3):
	print width + height
	print num



if __name__ == "__main__":
	x = animal("cow")
	print x.syurui
	print "-----"
	d= Dog("taro")
	e= Dog("ai")
	
	print "name="+d.name
	print "name="+e.name
	
	d.add_trick("test")
	e.add_trick("hoge")
	print d.tricks #

	d.add_list("mogumogu")  #add
	e.add_list("hokahoka")  #add
	print d.aList  #add
	print e.aList  #add

	
	print "-----"
	test()
	hoge(100,100)
	

実行結果

$ python /Users/maseda/Desktop/text/test_youtube2.py (リターン)
cow
-----
name=taro
name=ai
['test', 'hoge']
['mogumogu']
['hokahoka']
-----
test func
200
3

参考サイト

python-izm 関数
kura IT lab
Python チュートリアル

Python クラス継承(3)

学習内容
関数 def
クラス class
インスタンス (instance) を生成

スーパークラス、基底クラス、親クラス
class Human:

サブクラス、子クラス
class Ninja(Human):

サブクラス、孫クラス
class Hokage(Ninja):

# coding:utf-8

# class

class Human:
	def __init__(self,name,age):
		self.name=name
		self.age=age
		
class Ninja(Human):
	def ninjaPut(self):
		print "姓は"+self.name+"年齢は"+str(self.age)
		
class Hokage(Ninja):
	def hokagePut(self):
		print self.name+"は火影だ"
		
if __name__ == "__main__":
	print "----------start"
	sasuke = Ninja("うちは",16)
	naruto = Hokage("うずまき",16)
	
	print "----------"
	sasuke.ninjaPut()
	naruto.ninjaPut()
	naruto.hokagePut()
	print "end----------"

python (4)List型について学習

# 追加
# insert 指定した位置に数値を挿入
# remove  削除
# pop 末尾削除OR 指定位置削除
#index  数値の位置を取得
#count 同じ数が何個入っているか
#リストの総数 len(a)

# coding:utf-8
# list 
# func
def listTest():
	a=[10,11,12,13]
	#print a
	a.append(14)
	print "(1)"+ str(a)
	#insert
	a.insert(1,8)
	print "(2)"+str(a)
	#remove
	a.remove(8)
	print "(3)"+str(a)
	#pop 
	a.pop(1)
	print "(4)"+str(a)
	a.pop()
	print "(5)"+str(a)
	
	#index
	print "(6)index 13:"+str(a.index(13))
	
	#count 同じ数字が何個入っているか?
	print "(7)"+str(a.count(12))
	
	#リストの総数
	#print "(8)"+str(len(a))
	print "(81) %s" % "here"

if __name__ == "__main__":
	listTest()

pythonパイソン 入門(5) 文字列置換、検索,find,indexの違いは?

find,indexの違いは?
見つからない場合が異なる

find -1を返す
index エラー(例外処理が必要)

文字列
testStr = “(1)abcx(2)abcPPP”

(1)
文字列の位置を取得
abc
testStr.find(“abc”,0)

(2)文字列を置換
abcをPPPに置換
testStr.replace(“abc”,”PPP”,1) # 1回だけ、指定がないと全部置換される。

(3)ある文字列の次に出現する文字列を置換
最初のabcは無視して、次のabcを置換したいとき、
最初の出現位置が分からない場合
(abcが1組すら無い場合という条件は無視して、
必ず2組があるという条件で、後ろからの検索はしない)

1組目のabcを探し
i = testStr.find(“abc”,0)
その次からさらにabcを探します。
testStr.find(“abc”,i+1)
見つかれば、testStrをループして、2番めのabcまでの文字列を別の変数に入れ、
abcの文字数から次の文字列を取得して、さきほどの変数に連結します。

参考サイト
http://www.isl.ne.jp/pcsp/python/python19.html#fifth

# coding:utf-8


# |python,パイソン,入門,文字列置換,検索,find,indexの違いは?

# 検索、置換
# find -1, index is error-type
# global

global gStr
gStr = "(1)abcx(2)abcPPP" 


def test():
	testStr = gStr
	print "()"+testStr
	print "(1) %d" % testStr.find("abc",0)
	print "(2)"+testStr.replace("abc","PPP",1)
	
def testReplace():
	testStr = gStr
	outA = ""
	outB = ""
	i = testStr.find("abc",0)
	f = testStr.find("abc",i+1)
	for c in range(len(testStr)):
		if c>= f:
			outB+= testStr[c]
		else:
			outA+= testStr[c]
			
	print "(3)A="+outA
	print "(3)B="+outB
	reoutB = outB.replace("abc","PPP",1)
	print "(3-3)A+B2="+outA+reoutB
	print "(3-4)"+outB
	
if __name__ == "__main__":
	test()
	testReplace()
	
	
# 実行結果
# ()(1)abcx(2)abcPPP
# (1) 3
# (2)(1)PPPx(2)abcPPP
# (3)A=(1)abcx(2)
# (3)B=abcPPP
# (3-3)A+B2=(1)abcx(2)PPPPPP
# (3-4)abcPPP

Pythonパイソン、入門(6)正規表現 文字列検索プログラム

正規表現は、文字列の集合を一つの文字列で表現する方法

基本的なメタ文字、一部

. ドット、1文字一致 a.c,a..d
*,0回以上の繰り返し
+、1回以上の繰り返し
?、0回または1回に一致
[a-zA-Z] アルファベットの大文字小文字の1文字
[a-zA-Z]+ アルファベットの文字列
[0-9] 数字1桁
[0-9]+  数値1桁以上
\d 数字1桁
\d{2}数値2桁
\d{2,} 数値2桁以上
\d{2,4} 数値の2桁から4桁で一致

r’c.a’のようにrをつけるとバックスラッシュをそのまま使えるそうです。

モジュール
import re
re.search(成功するとMatch Obect を返す、失敗ではNoneを返す)
group():一致した文字列
start():一致した文字列の開始位置
end():一致した文字列の終了位置
span():一致した文字列の範囲をタプルで返す

# coding:utf-8
# http://www.geocities.jp/m_hiroi/light/python04.html
import re

global orgStr
orgStr = u"aaacab123aab<!--shinobi1 Town -->(文字)<!--shinobi2-->456"
# 「<!--shinobi」と「-->」で囲まれた文字列を検索したい

global twoOrgStr
twoOrgStr = u"<!-- NINJA ANALYZE Town-->(文字)<!-- /NINJA ANALYZE -->"


# シンプルな正規表現から
def simple():
	firstStr = r'c.b' #cab
	secondStr = r'a..c' # aaac
	thirdStr = r's[fgh][hij]nobi' # shinobi
	forthStr = r'\d{3}' #123
	
	a= re.search(firstStr,orgStr)
	if a==None :
		print a
		print "ありません"
	else:
		print "(A)見つかりました。"
		print a.group()
		print a.start()
		print a.end()
		
def test():
	firstStr = r'<\!--shinobi.*-->' # .*は最長一致
	secondStr = ""
	a = re.search(firstStr,orgStr)
	# 「<!--shinobi1 Town -->(文字)<!--shinobi2-->」で見つかる
	if a == None :
		print a 
		print "該当の文字はありません"
	else :
		print "(1)見つかりました。"
		print a.group()
		print a.start()
		print a.end()
	
def test2():
	firstStr = r'<\!--shinobi.*?-->' # ?を追加すると最短一致
	secondStr = ""
	a = re.search(firstStr,orgStr)
	# 「 <!--shinobi1 Town -->」で見つかる
	if a == None :
		print a 
		print "該当の文字はありません"
	else :
		print "(2)見つかりました。"
		print a.group()
		print a.start()
		print a.end()

def test3():
	firstStr = r'<\!-- \/?NINJA ANALYZE.*-->' # .*は最長一致
	a = re.search(firstStr,twoOrgStr)
	# 「<!-- NINJA ANALYZE Town-->(文字)<!-- /NINJA ANALYZE --> 」で見つかる
	if a == None :
		print a 
		print "該当の文字はありません"
	else :
		print "(3)見つかりました。"
		print a.group()
		print a.start()
		print a.end()

def test4():
	firstStr = r'<\!-- \/?NINJA ANALYZE.*?-->' #.*?は最短一致
	a = re.search(firstStr,twoOrgStr)
	# 「 <!-- NINJA ANALYZE Town-->」で見つかる
	if a == None :
		print a 
		print "該当の文字はありません"
	else :
		print "(4)見つかりました。"
		print a.group()
		print a.start()
		print a.end()
		
		
def metaFileread():
	checkStr = u"<meta name=\"robots\""
	firstStr = u"<meta name=\"robots\" content=\"nofollow\" />"
	#import codecs
	fread = codecs.open('a.html','r','euc-jp') # euc opne 
	unicodeText=unicode(fread,'euc-jp') #euc to uni
	
	# output
	eucText=unicodeText.encode('euc-jp')
	
if __name__ == "__main__":
	simple()
	#test()
	#test2()
	#test3()
	#test4()

参考URL
http://www.geocities.jp/m_hiroi/light/python04.html

Pythonパイソン、入門(7)、ファイル入出力、FileI/O 文字コード変換

パイソンはUnicodeがお好き

読み込み
import codecs
fin = codecs.open(‘euc.txt’, ‘r’, ‘euc_jp’) #euc文字コードで読み込み
str=fin.read()
fin.close()

ファイル出力 
fout = codecs.open(‘out.txt,’w’,’euc-jp’) #euc文字コードで書き込み
str = “tes”
fout.write(str)
fout.close()

文字の変換はUnicodeを使おう、ファイル出力はUTF-8他の文字コードを使う
Unicodeはちょっと面倒だけど、Unicodeであれば文字列の処理が楽

uをつけてUnicode
text_uicode= u’今日は良い天気’ 

UTF-8からUnicodeへの変換
unicodeText= unicode(utfText,’utf-8′)

そして、UnicodeからUTF-8への変換
utfText= unicodeText.encode(‘utf-8’)

コード変換例
EUC-JPに変換
s = s.encode(‘euc-jp’);

# coding:utf-8
# http://www.geocities.jp/m_hiroi/light/python04.html
import re
import codecs
import os
import glob # file list
import os.path

global dataOrg
global outStr



def readFile():
	global dataOrg
	curdir = os.getcwd()
	path = os.path.join(curdir,"Desktop/work")
	
	files = glob.glob(path+'/*.html')
	for c in files:
		print c # /Users/maseda/Desktop/text/out.html
		print os.path.basename(c) #out.html
		
	try:
		#html改善抜粋タイプA.html
		fread = codecs.open(path+'/mens_flyjacket_59_i.html','r','euc-jp') # euc to Unicode
	except Exception,e:
		print e,'error cannot File open, nothing'
	else:
		dataOrg = fread.read().replace('\r\n','\n') # crlf to lf
		#print dataOrg
		fread.close()
	finally:
		pass
		#fread.close()
	

	#print str(len(fread))
	#for c in range(len(data)):
	#	print data[c]
	#unicodeText = unicode(data,'euc-jp') #euc to uni
	

def outFile():
	global outStr
	curdir = os.getcwd()
	path = os.path.join(curdir,"Desktop/output")
	try:
		fout = codecs.open(path+'/out.html','w','euc-jp')
	except Exception,e:
	 	print e,'write error'
	else:
		
		fout.write(outStr.replace('\n','\r\n'))
		fout.close()
	finally:
		print "write done."

def metaChange():
	global outStr, dataOrg
	outStr = ""
	checkStr = u"<meta name=\"robots\""
	firstStr = u"<meta name=\"robots\" content=\"nofollow\" />"
	if dataOrg == "":
		print "dataOrg is empty, check file"
		return
		
	i = dataOrg.find(checkStr,0)
	if i == -1:
		print "meta name is non. So change"
		outStr = dataOrg.replace("<head>",u"<head>\n"+firstStr)
		#print outStr
	else:
		print ""
		outStr = dataOrg
		
def shinobi():
	global outStr
	firstStr = r'<\!--shinobi.*?-->' # .*?は最短一致
	# 「<!--shinobi1 Town -->(文字)<!--shinobi2-->」で見つかる
	#ただし、複数行はだめです。「<!--shinobi1 Town -->」として見つかる
	if outStr =="":
		return
	a = re.search(firstStr,outStr)
	forwordStr = ""
	backwordStr = ""
	tmpStr = ""
	if a == None:
		print "a shinobi()見つかりません"
	else:
		#print a.start(),a.group()
		for c in range(len(outStr)):
			if c > (a.start()+len(a.group())):
				backwordStr += outStr[c]
			elif c >= a.start() and c < a.end() :
				pass
			else:
				forwordStr += outStr[c]
		b = re.search(firstStr,backwordStr)
		if b == None:
			print "b shinobi()見つかりません"
		else:
			for c in range(len(backwordStr)):
				if c > b.end():
					tmpStr += backwordStr[c]
				else:
					pass
			outStr = forwordStr + tmpStr

def ninja():
	global outStr
	firstStr = r'<\!-- \/?NINJA ANALYZE.*?-->' #.*?は最短一致
	if outStr =="":
		return
	a = re.search(firstStr,outStr)
	#以下shinobi()と同じ
	forwordStr = ""
	backwordStr = ""
	tmpStr = ""
	
	if a == None:
		print ""
	else:
		for c in range(len(outStr)):
			if c > (a.start() + len(a.group())):
				backwordStr += outStr[c]
			elif c >= a.start() and c < a.end():
				pass
			else:
				forwordStr += outStr[c]
		b = re.search(firstStr,backwordStr)
		if b == None:
			print ""
		else:
			for c in range(len(backwordStr)):
				if c > b.end():
					tmpStr += backwordStr[c]
				else:
					pass
			outStr = forwordStr + tmpStr
	
def table():
	global dataOrg
	global outStr
	#print outStr
	if outStr == "":
		print "table()文字がありません"
		return
	#firstStr = r'(<table border=1>).*(<\/table>)' #うまくいかずtableCheckで検討して
	secondStr = r'<table border=1>'
	thirdStr = r'<\/table>'
	a = re.search(secondStr,outStr)
	b = re.search(thirdStr,outStr)
	if a == None or b == None:
		print "該当のtable tag文字はありません"
	else:
		tmpStr=""
		separateStr = ""
		for c in range(len(outStr)):
			if c >= a.start() and c < (b.start()+len(b.group())):
				# c >7 and c < 20
				separateStr += outStr[c]
			else:
				tmpStr += outStr[c]
		print "************"
		outStr = tmpStr
		print outStr
		print "---cut----"
		print separateStr

def tableII():
	global dataOrg
	global outStr
	#print outStr
	if outStr == "":
		print "table()文字がありません"
		return
	#firstStr = r'(<table border=1>).*(<\/table>)' #うまくいかずtableCheckで検討して
	#引数にして他のテーブルタグでも削除できるようにしましょう。
	secondStr = r'<table border=1>'
	thirdStr =  '</table>'
	a = re.search(secondStr,outStr) # こっちはsearchでOK
	b = outStr.find(thirdStr,a.end())
	if b == -1:
		print "</table>が見つかりません"
		#return
	if a == None:
		print "該当のtable tag文字はありません"
	else:
		tmpStr=""
		separateStr = ""
		for c in range(len(outStr)):
			if c >= a.start() and c < (b+len(thirdStr)):
				# c >7 and c < 20
				separateStr += outStr[c]
			else:
				tmpStr += outStr[c]
		print "************"
		outStr = tmpStr
		#print outStr
		#print "---cut----"
		#print separateStr
		

def otherTable():
	secondStr = r'<table width=\"393\"'
	thirdStr =  r'</table>'
	tableValue(secondStr,thirdStr)
	
def tableValue(secondStr,thirdStr):
# '<table width=\"393\"' で試して
 	global dataOrg
	global outStr
	if outStr == "" :
		print "文字がありません"
		return
		
	if secondStr == "" or thirdStr == "":
		print "どちらかまたは両方の引数に値がありません"
		#return

	#secondStr = r'<table border=1>'
	#thirdStr =  '</table>'
	a = re.search(secondStr,outStr) # こっちはsearchでOK
	b = outStr.find(thirdStr,a.end())
	if b == -1:
		print thirdStr + "が見つかりません"
		#return
	if a == None:
		print secondStr + "該当のtable tag文字はありません"
	else:
		tmpStr=""
		separateStr = ""
		for c in range(len(outStr)):
			if c >= a.start() and c < (b+len(thirdStr)):
				# c >7 and c < 20
				separateStr += outStr[c]
			else:
				tmpStr += outStr[c]
		#print "************"
		outStr = tmpStr
		#print outStr
		#print "---cut----"
		#print separateStr
	
def tableCheck(): # うまくいかずなぜ? 複数行にまたがっているからか?
	global dataOrg
	global outStr
	#print outStr
	firstStr = r'<table border=1>.*</table>' #うまくいかず
	#secondStr = r'<table border=1>'
	#thirdStr = r'<\/table>'
	a = re.search(firstStr,outStr)
	if a == None :
		print "check該当のtable tag文字はありません"
	else:
		#print a.group()
		outStr = outStr.replace(a.group(),"")
		#print a.start()
		#print a.end()


def urlRakutenCut():
	global outStr
	firstStr = r'<a href=\"http://hb.afl.rakuten.co.jp/hsc/0cfbe596.90c0f00a.0cfbe55a.bcc7c9dc/\".*?border=\"0\"></a><br>'
	#firstStr = r'<a href=\"http:\/\/xxxxxxxxxxx\"><img src=\"53145\" border=\"0\".*?</a><br>'
	if outStr == "":
		return
	a = re.search(firstStr,outStr)
	if a==None:
		print "AF URLはありません"
	else:
		#print a.group()
		outStr = outStr.replace(a.group(),"")
		
		
# シンプルな正規表現から
def simple():
	firstStr = r'c.b' #cab
	secondStr = r'a..c' # aaac
	thirdStr = r's[fgh][hij]nobi' # shinobi
	forthStr = r'\d{3}' #123
	
	a= re.search(firstStr,orgStr)
	if a==None :
		print a
		print "ありません"
	else:
		print "(A)見つかりました。"
		print a.group()
		print a.start()
		print a.end()
		
def test():
	firstStr = r'<\!--shinobi.*-->' # .*は最長一致
	secondStr = ""
	a = re.search(firstStr,orgStr)
	# 「<!--shinobi1 Town -->(文字)<!--shinobi2-->」で見つかる
	if a == None :
		print a 
		print "該当の文字はありません"
	else :
		print "(1)見つかりました。"
		print a.group()
		print a.start()
		print a.end()
	
def test2():
	firstStr = r'<\!--shinobi.*?-->' # ?を追加すると最短一致
	secondStr = ""
	a = re.search(firstStr,orgStr)
	# 「 <!--shinobi1 Town -->」で見つかる
	if a == None :
		print a 
		print "該当の文字はありません"
	else :
		print "(2)見つかりました。"
		print a.group()
		print a.start()
		print a.end()

def test3():
	firstStr = r'<\!-- \/?NINJA ANALYZE.*-->' # .*は最長一致
	a = re.search(firstStr,twoOrgStr)
	# 「<!-- NINJA ANALYZE Town-->(文字)<!-- /NINJA ANALYZE --> 」で見つかる
	if a == None :
		print a 
		print "該当の文字はありません"
	else :
		print "(3)見つかりました。"
		print a.group()
		print a.start()
		print a.end()

def test4():
	firstStr = r'<\!-- \/?NINJA ANALYZE.*?-->' #.*?は最短一致
	a = re.search(firstStr,twoOrgStr)
	# 「 <!-- NINJA ANALYZE Town-->」で見つかる
	if a == None :
		print a 
		print "該当の文字はありません"
	else :
		print "(4)見つかりました。"
		print a.group()
		print a.start()
		print a.end()
		
		

if __name__ == "__main__":

	readFile()
	metaChange()
	tableII()
	shinobi()
	ninja()
	otherTable()
	urlRakutenCut()
	outFile()
	#print outStr
	print ""
	print "***done***"
	print ""

Pythonパイソン、入門(8)、ディレクトリのファイル一覧取得、html拡張子のあるファイルの一覧

import glob, os.path
files = glob.glob(‘test/*.html’) # *.htmlと指定できる、正規表現もOK
# ディレクトリかファイルがないときのために len(files) == 0としてチェックをいれましょう。
for c in files:
print c #フルパスとファイル名による出力
print os.path.basename(c) #ファイル名のみ

import os
files = os.listdir(‘test’) # ワイルドカード指定等が出来ない
for c in files:
print c

# coding:utf-8

#  ファイル一覧
import os,os.path
import glob

def readFile():
	curdir = os.getcwd()
	path = os.path.join(curdir,"Desktop/work")
	
	files = glob.glob(path+'/*.html')
	if len(files) == 0:
		print "dir is wrong or file not"
		return
	for c in files:
		print c # /Users/maseda/Desktop/text/out.html
		print os.path.basename(c) #out.html


if __name__ == "__main__":
	print "***"
	readFile()
	

ディレクトリ取得の参考サイト

・ファイル・ディレクトリ取得
#指定パスが存在するかどうか確かめる,など、実際の入力コードがあります。

http://www.gesource.jp/programming/python/code/0001.html

こちらの記事もどうぞ