内容
- 1 パイソンPython 入門、学習
パイソン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 入門(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