\n
[ トップページ ]
[ ___ _CommandPrompt ]
[ ___ _JScript ]
[ ___ _MySQL ]
[ ___ _Cygwin ]
[ ___ _Java ]
[ ___ _Emacs ]
[ ___ _Make ]
[ ___ _Perl ]
[ ___ _Python ]
[ ___ _OpenGL ]
[ ___ _C# ]
[ ___ _StyleSheet ]
[ ___ _C++ ]
[ ___ _Winsock ]
[ ___ _Thread ]
[ ___ _VisualStudio ]
[ ___ _C ]
[ ___ _Win32API ]
[ ___ _Lua ]
[ ___ _PhotoShop ]
ヘッダ検索
■ 下準備
■ 文字コード
ASCII 以外の文字コードを スクリプトファイルに含めるときは
その文字コードをインタープリタに知らせる必要がある。
( エンコーディング宣言という )
#! の次の行に文字コードを指定する。
このファイルは SJIS で書かれてるよー!
この宣言でファイル内の文字が utf8 でエンコードされているという扱いになる。
■ 実行可能ファイルにする
UNIX, Cygwin 上で実行する場合はシェルスクリプト同様に
ファイルの先頭にインタープリタのパスを記述することで実行可能なファイルになる。
#! /usr/bin/python
# coding: sjis
Windows にインストールしたインタープリタを利用する
#! c:/Python27/python.exe
# coding: sjis
■ 文字列(string)
文字列型のデータをつくるには'', "" 共に使える
"aaa"
'aaa'
# " を3つで囲むと改行込みで表現できる。
"" "
test
test
""
# 連続した文字列リテラルは連結される
"aaa" "bbb"
# 文字列で分割してリストを返す ( Token )
"aaa_bbb_ccc" .split( "_" )
# 連結
print "aaa" + "bbb" ;
# 繰り返し
print "aaa " * 5;
# 文字列型に変換
str(14)
# 部分文字列は スライス表記でする
s = "abc" ;
# 各文字をインデックスで指定する
s[0]
# 後ろから 1 番目
s[-1]
# 文字列の数
len( s );
# 文字列の置換
print "aaa" .replace( "aa" , "b" );
# 3文字より後
s[3:]
print ( "str = " + str( 14 ) )
■ tolower . toupper
# 子文字にする
"AAA" .lower()
# 大文字にする
"aaa" .upper()
■ 日本語のあつかい
python が内部で扱う文字コードを unicode という。
unicode を生成するには u を文字列の前につける。
具体的な文字コードに byte 列にするには encode を使う。
sjis = s.encode( "sjis" );
元に戻すには decode() をする。
■ unicode
文字列を格納するデータ型。
世界中の文字をひとつのコード値に対応づける。
unicode でない場合は 256 個のコード値を文字体系ごとに割りなおす必要がある。
既存の文字列型とも相互に変換できる。
POINT
unicode とはコンピュータ上の具体的な値ではなく
世界中の文字の集合のこと。
各エンコードをすることで、表示可能となる。
デコードは実データをユニコード文字集合の各要素(コード値)に変換すること。
# unicode 文字列を utf-8 でエンコードする
u"あ" .encode( "utf-8" );
# sjis でかいたバイト文字列を unicode にデコードする。
"あ" .decode( "utf-8" );
文字列リテラルの前に u をつけると unicode 文字列を表す
# unicode 型の文字列を生成する
u"aaa"
■ RawString
文字列リテラルの前に r をつけると エスケープシーケンス \ の効力が向こうになる。
POINT
正規表現のあらわすのに便利
"\n" は 改行文字ではなく \ と n の2文字をあらわす
■ 制御構文
■ 論理演算子
a = 10
b = 20
if a == 10 and b == 20:
print "true"
if a == 10 or b == 20:
print "true"
if not a == 10 and b == 20:
print "true"
■ if
SYNTAX
if expression : statement
elif expression : suite
["else" ":" suite]
s = "test2"
if s == "test" :
print "test"
elif s == "test2" :
print "test2"
else:
print "else"
list に対しての存在チェックをする
if "a" in [ "a" , "b" , "c" ]:
print "a is exist"
■ for
a = [ "a" , "b" , "c" ]
for i in a :
print i;
for i in range( len(a) ) :
print i;
# 指定した回数をループするには range() でリストでつくる。
# 0 1 2 3
for i in range(4):
print i
# 1 から 9 まで
for i in range(1, 10):
print i
# 2 コ飛ばし
for i in range(1, 10, 2):
print i
# 逆順に
for i in range(10, 0, -1):
print i
WARNING
# この記述だめらしい
for (s in a):
■ while
SYNTAX
while 条件式 :
statement
cnt = 0;
while True:
print "cnt = " + str(cnt);
if ( cnt > 0 ) :
break;
■ 演算子
■ 算術
a = 10 + 20
a = 10 - 20
a = 10 / 2
a = 10 * 2
a = 10 % 2
WARNING
increment はない
次の演算子はできる
■ 関数(Function)
SYNTAX
def 関数名 ( arg ):
statement
返値は複数個を指定をできる
def f():
return 1, 2
a, b = f()
# リストを2つ返す
def f():
return ["aaa" , "bbb" ], ["ccc" ]
■ 変数のスコープ
関数内の変数はローカルになる
g = 20
def test():
# ローカル
i = 10
# グローバルも参照できる
print g
# グローバルの値を変更するには global 文を利用する
global g = 10
■ 引数(Argument)
python デフォルト引数
デフォルト引数を利用するときは 引数の後に デフォルト値を設定する
は関数を呼ぶときに省略できる。
dialogbox( msg="test" , title="title" ):
# デフォルト値があるパラメータは省略できる。
dialogbox()
WARNING
デフォルト値は一度しか評価されない。
関数呼び出し毎には評価されない。
複数のデフォルト引数から、特定の引数だけ値を設定する場合はキーワード引数を使う。
引数を指定しない場合はパラメータが順番に渡される。
dialogbox( title="Prompt" );
キーワードを指定しない場合は 0 番目の引数から順番にわたる
WARNING
固定の引数の後に指定する必要がある。( 可変なため )
# ERROR
test( arg1="foo" , 10 )
■ 可変引数
*args に可変引数をタプルとして受け取り, **kwargs でキーワード引数を Dictionary として受け取る
def func(*args, **kwargs):
print args
print kwargs
func( "a" , 1, 2, test=1, foo="2" )
■ 無名関数(lambda)
SYNTAX
lambda argument : expression
DESC
単一の式で値を返す処理は 無名関数として定義できる
mul2 = lambda x : x * 2
ret = mul2( 10 )
■ 高階関数
関数を引数としてもらう関数のこと
関数をもらうことができるので、具体的な処理をパラメータ化できる。
関数ポインタのように扱うことができる。
def compare( x,y ):
a = [ 1, 2, 3, 4 ]
a.sort( compare )
■ コンテナ
POINT
len() はリストの他に文字列やタプル、辞書などの要素数を取得できる
■ リスト(list)
# 初期化
a = []
a = ["A" , "B" , "C" , "A" ]
# 要素数
print len(a)
# 追加
a.append( v );
# 挿入 ( i 番目に v を追加する )
a.insert( i, v );
a.insert( 0, v );
# 削除
a.remove( v );
# 削除
a.pop( i );
# ソート
a.sort();
# 2つのリストを結合する。
# [1,2,3,4,5,6]
a = [1,2,3] + [4,5,6]
WARNING
重複の除去 ( uniq )はない
インデックスをつけるには enumerate() を使う
for i, v in enumerate( ["a" , "b" , "c" ] ):
print i, v
スタックとして使う
スライスを使うとリストの部分を切り出せる。
スライスした結果もリストとなる。
sys.path[1:2]
a[1:-2]
a[1:]
a[:2]
# リスト全体をかえす
a[:]
WARNING
変数はオブジェクト( リスト )の参照をとるため、コピーが必要ならばスライスをする
a = [1,2,3]
b = a
b[0] = 7
# [7,2,3]
print a
スライスをすることで a, b は別のオブジェクトを参照する。
b = a[1]
b[0] = 7
# [1,2,3]
print a
■ セット(set)
POINT
集合とは要素が重複しない集まりこと。
ブーリアン演算もできる。
a = set( [ "a" , "b" , "c" ] );
■ tuple(タプル)
SYNTAX
( object, ... )
t = (1, "2" , "aaa" , 0.5)
# 要素をとりだす
t[1]
# タプルオブジェクトは変更できないため、要素の変更はできない。
t[1] = 10
# 連結
t2 = t + ( "a" , "b" )
■ Dictionary(Map)
# 空の辞書
a = {};
# 初期化子リストで初期化
tbl = { "tanaka" : "090-xxx" , "sato" : "090-xxx" , }
# 要素数( 2 )
len( tbl )
# 辞書に追加する
tbl[ "foo" ] = "bar"
# iteritem() 関数を使うと反復できる。
for k, v in tbl.iteritems():
print k;
print v;
# クリア
tbl.clear()
# 削除
del tbl[ "tanaka" ]
# 存在をテストする
if "tanaka" in tbl:
print tbl["tanaka" ]
if "tanaka" not in tbl:
print "nai"
■ フィルター(filter)
def f(i): return x % 2 == 0;
filter( f, range(1, 10) )
■ 写像(map)
def f(i): return x % 2 == 0;
filter( f, range(1, 10) )
■ 組み込み関数
■ キャスト(cast)
# 文字列, 整数を float に変換
float( "10" )
# 文字列, 数値を 整数に変換
int ( 10.5 )
# 数値を 16 進数の文字列に変換
hex( 10 )
■ オブジェクト
a = 10
# オブジェクトの id を整数値として返す
print id( a )
■ 型チェック
# オブジェクトの型を調べる
class Foo(): pass
f = Foo()
isinstance( f, Foo )
# list であるかチェックする
if isinstance( a, list ):
if subclass( Foo, list ):
len( "abc" )
len( [1,2,4] )
# 型オブジェクトを返す
type( 1 )
if type("aaa" ) is str:
print "str"
■ 評価
文字列を python の式として評価して結果をかえす
■ モジュール(module)
頻繁に利用する関数、クラスなどの定義、文をファイルとしてまとめておける。
これをモジュールという。
モジュールはインポートすることで利用できる。
■ モジュールの作成
モジュールにしたい関数、クラスを定義する。
実行可能な文も記述できる。
def f():
print "test module"
■ インポート(import)
モジュールを import するには 4 つの方法がある。
test.py をインポートする。
この時点では モジュール名の test だけがシンボル表にはいる。
モジュール内のシンボルを参照するには モジュール.シンボル とする。
test.f();
# 頻繁に利用する場合は ローカル変数に代入する。
f = test.f;
f();
モジュール名ではなく、モジュール内の名前をローカルシンボル表にいれることもできる。
from test import f
f();
# _ から始まる以外の名前をシンボル表にいれる。
from test import *
# os, sys をインポートする。 ( 複数のモジュールを同時に指定できる )
import os, sys;
# パッケージ内から特定のモジュールをインポートする。
import Sound.Effects.echo;
# ネームスペースを省略する。
from Sound.Effects import echo;
# 指定した package 以下のすべてのモジュールをロードする
# パッケージ内の __init__.py の リスト __all__ のモジュールがすべてロードされる
from Sound.Effects import *;
別名をつけることで、名前を短くできる。
import os.path as p
p.basename( "d:/py.txt" );
■ dir
モジュール内で定義されている名前を調べるには組み込み関数 dir() を使う。
ソート済みの文字列のリストが返る。
ヘルプ機能として使える。
import sys, math
print dir( sys )
print dir( math )
引数なしでコールすると、現在定義されている名前のリストを返す。
組み込みの関数、変数は組み込みモジュール __builtins__ に定義されている。
■ 検索パス
次の順番で python が検索する。
検索パスは sys.path で確認ができる。
import sys
print sys.path
import をする前に sys.path の順番を変更することで import するモジュールを切り替えることができる。
sys.path.insert( 0, "d:/python" )
import foo
WARNING
自分で書いているスクリプト自身も最初の検索の対象になるため
モジュールと同名のファイルにしないこと。
# wx.py というファイルを用意した場合以下のimport文は自分自身をロードしてしまう。
import wx;
# チェックするには __file__ で見る。
print wx.__file__
■ パッケージ(package)
module をパッケージしたもの。
ディレクトリ構造でパッケージされる。
パッケージをつくるには, 入れ物となるディレクトリをつくる。
検索パス以下に置く。
WARNING
__init__.py というファイルは各パッケージごとに必須。
ないとパッケージ内のモジュールをインポートできない。
$PYTHON_PATH
/testpack/
__init__.py
foo.py
import する側はディレクトリをパッケージ名にしてインポートする。
import testpack.foo
# module 内の関数をコールする
testpack.foo.func()
__init__.py はパッケージの初期化時に評価される。
__all__ 属性にロードしたい対象のリストをいれておくと * で同時にロードできる。
インポートする側は * を指定することで __all__ で指定したすべてのモジュールをロードできる。
■ クラス(class)
SYNTAX
class NAME:
statement;
クラスを定義する。
定義が評価されるとクラスオブジェクトが生成される。
class Test:
# これはクラスオブジェクトの変数 ( C++ でのメンバとは異なる )
i = 10;
def __init__( self, i ):
self.i = i;
def f( self ):
print "calll method = " , self.i
クラスをインスタンス化するには関数表記() を使う。
これによって空のオブジェクトが作成される。
x = Test();
# 生成されたインスタンスには属性参照ができる
# データ属性を参照する
print x.i;
# 関数オブジェクトのデータ属性を参照する
print x.f;
# メソッドをコールする。
#
x.f();
# メソッドをコールすると第一引数としてインスタンスが関数に渡される。
# 次の処理と同じ。
Test.f( x );
■ コンストラクタ . constructor
__init__ というメソッドを定義すると
インスタンス生成の時点でコールされる。
class Test
def __init__( self, i, j ):
self.i = i;
# コンストラクタに引数を渡してインスタンスを作成する
i = Test( 10, 2 );
■ メソッド(method)
class Test
def f( self, i, j ):
self.i = i;
# メソッドから別のメソッドをコールするには self 引数を経由する
def g( self ):
self.f();
# メソッドをコールする。
x.f();
POINT
# これと同じ
Test.f( x );
■ プライベート変数
POINT
クラス内アクセス限定にするには識別子に __ を2個以上を前置する。
これによって名前が変更されるため、外からアクセスされにくくなる。
class Test
def f( self, i, j ):
self.i = i;
def __p( self ):
print "calll private method"
i = Test( 1, 0 );
# これはコールできない
i.__p();
POINT
名前を変更しているにすぎないので, 次のようにコールできる
i._Test__p();
■ 文字列表現
__str__ をオーバーライドすると str() 関数の結果をカスタマイズできる
class Test:
def __str__(self):
return "test" ;
t = Test()
print str(t)
■ 継承
SYNTAX
class Name( Base ):
statement:
class D( Test ):
def h( self ):
print "call method h"
# オーバーライドするには同名の属性をつける。
def f( self ):
print "call overwrite method f"
# 派生クラスをインスタンス化する
i = D(10, 1);
i.h();
POINT
# メソッドの探索は派生クラスから順番にされる。
# 属性名として f を指定すると D.f() -> Test.f()と順番に検索される。
i.f();
すべてのクラスは object を継承する。
# 明示することもできる。
class Test( object ):
pass
# これと同じ
class Test:
pass
■ 内部クラス
class Test:
class Type:
"" "
内部クラス
"" "
■ オペレータのオーバーライド
def Vector:
def __add__(self, rhs ):
def __sub__(self, rhs ):
def __mul__(self, rhs ):
■ Error
POINT
ファイル, ラインが表示されるので、問題箇所は一目できる。
■ 例外の処理(try-catch)
SYNTAX
try:
statement
except Error:
statement;
finally:
try:
except IOError:
# 例外名を指定しないとすべての例外をとらえる
except :
# finally 節は必ず実行されるので, クリーンナップ処理をかいておく
finally:
# 例外をなげる。
ネットワークプログラムで try - catch を使ってみる。
import socket
host = '127.0.0.1'
port = 8080
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect((host,port))
except:
print "connect error"
exit()
■ 例外を定義する
class Except( Excepction ):
■ with
with 文を使うと終了処理が必ず実行される。
with open( "test.txt" ) as f:
for s in f:
print s;
■ math
■ 組み込み関数
# 1
abs( -1 )
# 商とあまりを返す
d, m = divmod( 10, 3 )
# 1024
pow( 2, 10 )
# 1
round( 1.23 )
# 小数第一位
# 1.2
round( 1.23, 1 )
■ 標準ライブラリ
import math;
math.cos( math.pi );
math.sin( math.pi );
math.degrees( math.pi )
math.radians( math.pi )
import random
# [0:1)
random.random()
WARNING
# ++ がないかもしれない
i = 0
i += 1
■ numeric(数値演算)
REF
numeric
ベクトル
v = numpy.array( (2.0, 2.0, 1.0) )
# ノルム
l = numpy.linalg.norm(v)
# 内積 外積
numpy.dot(v1,v2)
numpy.cross(v1,v2)
行列
m = numpy.matrix( (
(2.0, 0.0, 10),
(0.0, 3.0, 10),
(0.0, 3.0, 10),
) )
# 逆行列, 転置
print ( a.I )
print ( a.T )
# 行列式
numpy.linalg.det(a)
#行列とベクトルの積
ret = numpy.dot(mat,v)
#行列の積
ret = m * m;
■ コマンドライン(引数解析).commandline
簡単に使うには os.sys.argv を使う。
# 0 番目の引数は スクリプトパス
for s in os.sys.argv:
print s
# len( sys.argv ) == 4
shell> test.py a b c
■ OptionParser
引数を解析して, 結果を dictionary として返す。
from optparse import OptionParser
parser = OptionParser()
# -f FILE の値を filename 変数にセットする
parser.add_option( "-f" , "--file" , dest="filename" );
(opts, args) = parser.parse_args()
print opts.filename
# 次のように呼ぶ
test.py -f d:/test.xml
ON/OFF のフラグを指定する
# action で -q がセットされた時の処理を指定する。
# デフォルト は変数への store で、 store_false は False の値を verbose 変数にセットする。
parser.add_option("-q" , "--quiet" ,
action="store_false" , dest="verbose" , default=True );
(opts, args) = parser.parse_args()
print opts.verbose
test.py -q
ヘルプを追加する。
parser.add_option("-f" , "--file" , dest="filename" ,
help="write report to FILE" , metavar="FILE" )
■ urlencode.URL.エンコード
各文字コードに変換してから urllib2.quote に渡す。
import urllib2
s = u"あああ"
urllib2.quote( s.encode("utf-8" ) )
■ ネットワーク(Network)
■ urllib2
指定した URL のリソース( HTML など )を取得する。
urllib よりも機能が豊富
import urllib2
for line in urllib2.urlopen( "http://www.google.co.jp" ):
print( line );
■ urllib
POINT
1度の read() ですべてを読める保障がないので繰り返す。
# urlopen を使って ネットワーク先のリソースを開く
p = urllib.urlopen( "http://www.google.co.jp" )
# read() を使って読む。
s=""
while (1):
st = p.read()
if not st:
break;
s += st
■ socket . ソケット
DESC
低レベルのソケットAPIを利用できる。
WinSock などの API とほぼ同じ。
WinSock の使い方
import socket
# ローカルのウェブサーバからページを取得。
host = '127.0.0.1'
port = 8080
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host,port))
# GET メッセージをなげて、ページを取得。
sock.sendall("GET / HTTP/1.0\r\n\r\n" );
while True:
rcvmsg = sock.recv(1024)
print 'Received -> \n%s' % (rcvmsg)
if rcvmsg == '':
break
sock.close()
■ ftplib
ftplib を利用すると FTP プロトコルを利用してサーバにファイルを
アップロード、ダウンロードすることができる
ftp = ftplib.FTP( "server" , "user" , "password" )
# サーバのカレントディレクトリを移動
ftp.cwd( 'www' )
# ローカル d:/test.txt へ保存する
f = file.open( "d:/test.txt" )
ftp.retlines( 'RETR ' + filename, lambda line: f.write( line + "\n" ) )
f.close()
ftp.quit()
■ gui
■ Tkinter
from Tkinter import *
class Application(Frame):
def say_hi(self):
print "hi there, everyone!"
def createWidgets(self):
self.gui = Button(self)
self.gui["text" ] = "QUIT"
self.gui["fg" ] = "red"
self.gui["command" ] = self.quit
self.gui.pack({"side" : "left" })
self.o = Button(self)
self.o["text" ] = "Hello" ,
self.o["command" ] = self.say_hi
self.o.pack({"side" : "left" })
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()
root = Tk()
app = Application()
app.mainloop()
root.destroy()
■ wxPython
Window をだす
import wx
app = wx.App()
frame = wx.Frame(None, -1, "simple" )
frame.Show(True)
app.MainLoop()
GUI部品を配置する
app = wx.App()
frame = wx.Frame(None, -1, "simple" )
frame.Show(True)
wx.StaticText(frame, -1, "test" , (10, 10))
wx.Button(frame, -1, "push" , (10, 20))
app.MainLoop()
キーボードイベント
import wx
class Test(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)
panel = wx.Panel(self, -1)
panel.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
panel.SetFocus()
self.Show(True)
# keyboard Callback
def OnKeyDown(self, event):
keycode = event.GetKeyCode()
if keycode == wx.WXK_ESCAPE:
ret = wx.MessageBox('Are you sure to quit?', 'Question',
wx.YES_NO | wx.NO_DEFAULT, self)
if ret == wx.YES:
self.Close()
event.Skip()
app = wx.App()
Test(None, -1, "keyevent" )
app.MainLoop()
ボタンイベント
import wx;
class MyButton(wx.Button):
def __init__(self, parent, id, label, pos):
wx.Button.__init__(self, parent, id, label, pos)
self.Bind(wx.EVT_BUTTON, self.OnClicked)
def OnClicked(self, event):
print 'event reached button class'
event.Skip()
class Propagate(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(250, 150))
# panel = MyPanel(self, -1)
MyButton(self, -1, 'Ok', (15, 15))
#self.Bind(wx.EVT_BUTTON, self.OnClicked)
self.Show(True)
def OnClicked(self, event):
print 'event reached frame class'
event.Skip()
app = wx.App()
Propagate(None, -1, "propagate" )
app.MainLoop()
■ 時刻(date.time.timer)
from datetime import date
# 2012-01-08
print date.today();
■ timer
import timeit;
t = date.today();
■ test
# docstring に埋め込まれたテストを実行する
import doctest;
■ Thread . スレッド
import threading;
import time;
class Worker( threading.Thread )
def __init__();
def run(self):
# 3 秒まつ
time.sleep(3);
f = open();
w = Worker();
w.start();
# 終了まち
w.join();
class FileLoader(threading.Thread):
def __init__( self, a ):
threading.Thread.__init__(self)
self.a = a
def run( self ):
for path in self.a:
path
■ 標準ライブラリ
■ 正規表現(regexp)
import re
print "aaa" .replace( "aa" , "b" );
print re.findall( r"\bf[a-z]+" , "foo bar fff" )
# マッチする文字をすべて置換
print re.sub( r"\bf[a-z]+" , "ddd" , "foo bar fff" )
# マッチするか検索。マッチすれば MatchObject を返す。
if re.match("^#include" , s ) != None :
print "not match"
re.search() は文字列に含まれる任意の部分文字列を探す
re.match() は文字列の先頭にある部分文字列を探す
WARNING
#include にはマッチしない
#print s,
if re.match("include" , s) != None :
print s
search ならば途中の文字列でも検索してくれる
if re.search("include" , s) != None :
print s
if re.search("include" , s) == None :
print "not match"
WARNING
文字としての | を指定する時はエスケープをすること
# | の左側は空文字列の指定になるため必ずマッチしてしまう。
if re.match( "|aaa" , "bbb" ) != None:
print "match"
if re.match( "\|aaa" , "bbb" ) != None:
print "match"
■ FileSystem(ファイルシステム)
# open は file object を返す
fp = open( "d:/test.txt" , 'w')
print f
fpW = open('d:/test.txt', 'w')
fpW.write("test" );
# stdin から入力
a = raw_input();
■ tmpfile
tmpfile を生成するには tempfile モジュールを使う。
import tempfile
path = tempfile.mktemp()
# / に変更する
path = tempfile.mktemp().replace('\\', '/')
■ os
directory を再帰的に作成する場合は, os.makedirs() を使う
import os
os.makedirs( "d:/foo/bar/goo" )
# カレントディレクトリの変更
os.chdir( "d:/" )
# カレントディレクトリ
os.getcwd()
外部プロセスの実行
import os
os.mkdir("d:/py/" );
os.mkdir("d:/foo/bar" );
# test.txt
os.path.basename( "d:/test.txt" );
# test.txt ( filename が返る )
os.path.basename( "d:/test.txt" );
# ( test, txt )
file, ext = os.path.splitext( "test.txt" )
# d:/foo
os.path.dirname( "d:/foo/test.txt" );
# True
os.path.isdir( "c:/" );
# ディレクトリ存在チェック
os.path.exists( "d:/foobar" );
# ファイル存在チェック
os.path.exists( "d:/test.txt" );
#
os.path.join
# ディレクトリ内のエントリをリストとして返す
os.listdir( "d:/" )
■ shutil
ファイルのコピーなどの操作は shutil モジュールを使う。
import shutil
shutil.copy( "d:/src.txt" , "d:/dst.txt" )
shutil.move( "d:/src.txt" , "d:/dst.txt" )
■ getFile
os.walk( パス )と渡すと
パス以下のディレクトリから、パス/サブディレクトリ/ファイル名のタプルを返す。
再帰処理をしなくても自動ですべてのファイルをイテレートする。
import os
for root, dirs, files in os.walk( "c:/" ):
for f in files:
print root, f
■ BuildPath
import os
# d:\test\foo\bar
os.path.join( "d:\\test" , "foo" , "bar" );
■ glob.getFile
ディレクトリからファイルのリストを取得するには glob を使う。
ディレクトリをワイルドカード検索してリストを返す
import glob
print glob.glob( "*.py" );
ディレクトリを含めたパターン指定もできる。
print glob.glob( "c:/users/*/*.py" );
■ interpreter
# interpreter を起動
python
c-d で終了
■ キャスト(cast)
■ 型
python のデータオブジェクトは次の2つがある
# 整数 float の計算は float に変換されて実行される
1 + 1.3;
■ 精度
10進数の小数点は 2進数では正しく表現できない。
近似した値がメモリに格納される。
■ print
SYNTAX
print expression[, expression]
# 複数の式をスペース区切りで出力する
print "aaa" , 10, "bbb" ;
# format するには % を利用する
print "File s is Not Exist" % "test.txt"
# 文字列操作でも format はできる
s = "Total Time %d Processd" % 10
■ OpenGL
C:\Python27\Lib\site-packages\
python ./ez_setup.py
Downloading http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-y2.6.egg
Processing setuptools-0.6c11-py2.6.egg
Copying setuptools-0.6c11-py2.6.egg to /usr/lib/python2.6/site-packages
Adding setuptools 0.6c11 to easy-install.pth file
Installing easy_install script to /usr/bin
Installing easy_install-2.6 script to /usr/bin
Installed /usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg
Processing dependencies for setuptools==0.6c11
Finished processing dependencies for setuptools==0.6c11
■ 画像処理(PythonImageLibrary)
import Image
# 開く
im = Image.open("d:/test.bmp" )
# フォーマットとサイズ
print im.format, im.size, im.mode
# 左右に反転
out = im.transpose(Image.FLIP_LEFT_RIGHT)
# 保存
out.save("d:/out.bmp" )
# 各ピクセルを 0.7 倍する
out = im.point(lambda i: i * 0.7)
# 成分ごとに分解
source = im.split()
R, G, B = 0, 1, 2
# マスクを作成する。
mask = source[R].point(lambda i: i < 100 and 255)
# 緑の成分を変更する
out = source[G].point(lambda i: i * 0.2)
# マスクを使ってペーストする。
source[G].paste(out, None, mask)
# 成分情報から Image object作成
im = Image.merge(im.mode, source)
■ xml
■ minidom
from xml.dom import minidom
# test.xml を開く
doc = minidom.parse("d:/test.xml" )
# < test> 要素を取得
e = doc.getElementsByTagName("test" )[0]
# test name= の値を取得
print(e.getAttribute("name" ))
# attribute をセット
e.setAttribute("name" , "test" )
print(e.getAttribute("name" ))
# XML 文書の全ての構成要素は Node のサブクラス
print ( e.parentNode.localName );
# Node をつくり、子供に追加
n = doc.createElement( "newnode" );
n.setAttribute( "key" , "value" );
e.appendChild( n );
# 保存
fp=open("d:/out.xml" ,"w" )
doc.writexml(fp)
fp.close()
■ プロセス(Process)
■ subprocess
SYNTAX
class Popen( args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None,
universal_newlines=False, startupinfo=None, creationflags=0)
subprocess モジュールの Popen コンストラクタを使う。
ps = subprocess.Popen( ['hostname'] )
ps.wait()
ps = subprocess.Popen( ["ping" , "localhost" ] )
ps.wait()
# shell が True の場合、 指定されたコマンドはシェル( cmd.exe ) を介して実行される。
ps = subprocess.Popen( ["ver" ], shell=True )
ps = subprocess.Popen( ["cmd" , "ver" ] )
■ import ctypes
from ctypes.wintypes import MAX_PATH
dll = ctypes.windll.shell32
buf = ctypes.create_unicode_buffer(MAX_PATH + 1)
if dll.SHGetSpecialFolderPathW(None, buf, 0x0005, False):
print(buf.value)
else:
print("Failure!" )
>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'
■ 環境変数(getenv)
import os
os.getenv("username" )
os.getenv("username" )
os.getenv( "TEMP" )
■ ExitCode . 終了コード