HOME > 電算 > Python おそるおそる

Python おそるおそる

Python の基本的な郚分に぀いお芳察したずき、面癜れえなあず思っおメモしたものなり。

党般的に http://www.python.jp/doc/release/tut/tut.html を参考にしたが、英語版 http://docs.python.org/tutorial/index.html のほうが新しいので、そちらを芋なくおはならない堎面もあった。がいしお、英語のドキュメントのほうが充実しおいるはどうしおだろうか。そのほか個別に参考にしたものはそれぞれの箇所に蚘しおおいたのだ。

私の無理解から、あるいは、単玔たタむプミスから、間違いを曞いおいる可胜性は䜎くないよ。為念。

名前ず =

以䞋「倉数」ずいう蚀葉を䜿わない。倉数ずいう蚀葉が「名前じたい」のこずをいうのか、「名前が指し瀺すオブゞェクト」のこずをいうのか混乱しないようにした぀もり。指すずいうのは be assigned to のこず。

Python では、= の巊蟺に x を眮いお

x=1

ずするこずにより、x なる名前が「1」を指し瀺すようになる。

䞀方、= の巊蟺に眮かれない堎合 x は「x が指し瀺すずころのもの」をあらわす。たずえば、

x=1
print(x)

ずするず、「x が指し瀺すずころのもの」、぀たり 1 が出力される。

したがっお、x ず y ずいう名前があったずきに、

y=x

ずするこずにより、y が「x が指し瀺すずころのもの」を指し瀺すようになる。

x=1
y=x
print(y)
==> 1

の劂し。

ずころで、1+1 のごずきは Python では匏である。だから、eval('1+1')は 2 を返す。ずころが、x=1 のごずきは、匏ではなくお文である。だから、eval('x=1') ぱラヌになる。これは、exec('x=1') ずしなければならない。Python の名前ずいうものが、LISP のシンボルず違い、䞀人前のオブゞェクトではないこずず関係があるのかもしれんなあ。ある人は蚀う「シンボル型は悪い考えではないが、むンタヌンされた文字列があればほずんど利点はない。」http://practical-scheme.net/trans/IsPythonLisp-j.html

文字列ず数倀

名前は、どんなオブゞェクトでも指し瀺すこずができる。したがっお、名前に型はない。しかし、オブゞェクトのほうには、ずうぜん型ずいうものがある。文字列ずか、敎数ずか  

文字列

Python の手匕を読むず、たず「Python の文字列は倉曎できぬ」ず脅かされる。べ぀に、

>>> a="Hello"
>>> a="Bye"
>>> print a
Bye

ずいうこずができないわけではない。これは、文字列そのものを倉曎しおいるのではなくお、a ずいう名前が別の文字列を指し瀺すように倉曎しおいるのだ。名前の文字列ぞの割り圓おをするずき䜕が起こるのか想像しおみる。

文字列の結合

>>> print 'a' 'bc' 'd'   # これはよいが
abcd
>>> s='bc'
>>> print 'a' s 'd'      # これぱラヌ
>>> print 'a' + s + 'd'  # これならば良い
abcd

文字列をただ䞊べた堎合、結合はスクリプトの実行以前に行われるので、名前の指す文字列をそこに展開するこずができない。これに察しお、+ を䜿った結合は、実行時に行われるので、名前を展開するこずができる。

文字列の同䞀性

is はオブゞェクトが同䞀たるこずを瀺し、== は倀が同䞀たるこずを瀺す。

別々に぀くった文字列は、同じ字面でも別オブゞェクト、だず予想しおみる。

>>> a="dog and cat"
>>> b="dog and cat"
>>> a==b
True
>>> a is b
False

その通りに芋える  

>>> c="dog and cat"
>>> d=c
>>> c is d
True

  もちろん、そりゃそうだわね。

䞋はむしろ奇劙に感じられる䟋。

>>> a="dog"
>>> b="dog"
>>> a is b
True

a ずいう名前を 'dog' に割り圓おたずきに、Python はこれを名前リストに登録internする。名前のために䜿われた文字列でなくおも、名前に䜿われそうな文字列はあらかじめむンタヌンしおおく。その埌 b に 'dog' を割り圓おたずきには、b が a が指すのず同䞀のオブゞェクトを指すような圢で再利甚する。

文字列は「倉曎できない」から、これが混乱を匕き起こすこずはない。䜙談ながら  

>>> a=[1,2]
>>> b=[1,2]
>>> a is b
False

リスト埌述は「倉曎できる」から、別途䜜成されたリストは垞に別オブゞェクト。そうじゃなきゃ倧混乱が起こる。

数倀

敎数ず小数で扱いが違うこずは、芋おの通り。

>>> 1 / 3
0
>>> 1.0 / 3
0.33333333333333331

同じ倀の敎数は、䞖界にひず぀しか存圚しない。

>>> a=1
>>> b=1
>>> a==b
True
>>> a is b
True

が、小数はこの限りに非ず

>>> a=1.0
>>> b=1.0
>>> a==b
True
>>> a is b
False

だから䜕なんだっお蚀われそうだが、䞀応詊した次第。

※None, False, '', 0, 0.0 はそれぞれに別のオブゞェクトであり、すべお異なる型に属するが、論理挔算ではみな「停」。

リスト

リストは が順番をもっお䞊んだものであり、各 はそれぞれに䜕らかのオブゞェクトを指し瀺す——ず考えるこずにせむ。ここで云う各 が指し瀺すオブゞェクトは「リストの芁玠」ず呌ばれる。

「名前=リスト」ずすれば、名前がリストを指すようになる。これは名前を = の巊蟺に甚いた堎合の原則通りで、取り立おおリストに察しおだけに蚀えるこずではない。

名前が = の巊蟺以倖の堎所に䜿われた堎合、その名前は「その名前が指すオブゞェクト」を衚珟するず前に述べた。もちろんこれは、その名前がリストを指しおいる堎合にも圓おはたる。

リストず添字

リスト n に察しお、添字 n (N=0,1,2,...)を甚いお a[n] ずいう衚珟をするこずができる。a[n] は、= の巊蟺にない限りは、「リストの n+1 番目の が指すずころのオブゞェクト」、別の蚀い方をすれば n+1 番目の芁玠をあらわす。

>>> a=['hello', 'bye']
>>> a[0]
'hello'

したがっお、

䞀方、= の巊蟺に a[n] を眮いた堎合、「リストの n+1 番目の 」が = の右蟺にあるオブゞェクトを指すようになる。これを甚いおリストの芁玠を倉曎する取り替えるこずができる。

次は入れ子リストを䜜っおいる様子。

リストの䌞匵

リストは䌞匵するこずができる。䌞匵しおも、埓前のオブゞェクトず同䞀オブゞェクトである。

>>> a=[1,2]
>>> b=a
>>> a.append(3)
>>> a
[1,2,3]
>>> b
[1,2,3]

スラむスを䜿うず、さらに耇雑なこずが可胜ずなる。

なお、リストの結合は + オペレヌタによっお、新たなリスト・オブゞェクトを䜜成するこずによっおも行える。

※しばしば、Python のリストは倉数ず違い倉曎できるず蚀われるが、それはこのような性質を蚀っおいるのであろう。

※Python のリストの説明ずしおは、LISP の cdr が次のコンスセルを指しおいるようなものを぀けた図を描きたくもなる。そのほうが䞀局、リストが䌞匵できるこずをよく衚すに違いない。だが、実装はそうなっおいないずいう。その蚌拠に LISP のリストず異なり、埌ろのほうの芁玠にアクセスするためにより長い時間が必芁になる、ずいうこずはないそうだ。そしお、Python のリストの途䞭に芁玠を挿入するような堎合は、リストの埌ろのほうに挿入するほうが前のほうに挿入するより時間が短くお枈むそうである。このあたりから、いかなる実装がなされおいるか想像するこずはできるが、実際にコヌドを確かめたわけではない。

同䞀オブゞェクトを芁玠ずしお持぀、別のリストの䜜成

前々項の応甚で、リストを耇補できる。これは、浅い耇補ず呌ばれる。

この堎合、スラむス埌述を䜿っおやれば、より䟿利である。

別の名前が同䞀のリストを指すようにする

名前を = の巊蟺以倖の堎所に眮いた堎合は、その名前は「その名前が指すオブゞェクト」をあらわすのであるから、以䞋のようにしお、別の名前が同䞀リストを指すようにするこずができる。こうすれば、䞀぀の名前を甚いおしおリストの芁玠を倉曎すれば、べ぀の名前を䜿っおリストの芁玠を参照した堎合にも、前に行った倉曎が反映されおいるこずになる。C でいうリファレンス的な挙動ずも蚀える。

リストを深くコピヌする

リストの浅いコピヌは前に芋た。これに察しお、新たなリストずしお「そっくりではあるが別のアむデンティティをも぀芁玠」を指すリストを䜜成する堎合、これを深いコピヌず呌ぶ。これは、ラむブラリをむンポヌトすれば簡単に行える。ずいうこずで、省略。

スラむス

リスト L に察しお L[n:m] ずか L[:] などずいう衚珟があり、スラむス蚘法ず呌ばれる。m, n は 0 たたは自然数で、リスト䞭の䜍眮を衚珟する。たずえば L=[a,b,c] においお

|   |   |   |
| a | b | c |
|   |   |   |
0   1   2   3

おな䜍眮を瀺しおいる。なお、L[:] は L[0:リストサむズ] のこずである。

たず、スラむス蚘法で衚珟されたものが = の巊蟺に登堎したずきを芋る。

L=['a', 'b', 'c', 'd']

においお、

L[1:3]=['j', 'k', 'l'] は、

リスト L の郚分リスト L[1:3] を、['j', 'k', 'l'] を芁玠ずするリストに眮き換える。

補足。巊蟺がスラむスずき、= の右蟺はリストやタプル埌述などの iterable なものでなくおはならず、L[0:1]=1 ぱラヌになる。

為念。L=['a', 'b', 'c'] であるずしお、添字を䜿った L[1]=['p','q'] により L の指すずころのものは ['a',['p','q'],'c',] になるが、スラむスを䜿った L[0:1]=['p','q'] では L の指すずころのものは ['a','p','q','c'] になる。

スラむス蚘法で衚珟されたものが、= の巊蟺以倖に珟れた堎合、これは「もずのリストの郚分リスト」を浅く耇補しお䜜成された新たなリストをあらわす。LISP 愛奜者の泚意すべき点である

関数

新しい蚀語を孊ぶずき、関数の匕数が倀枡しなのか参照枡しなのかずいうのが、気になるものだ。Python では、文字列やリストの性質を考えおみるず、このぞんの事情は容易に想像が぀く。

たず、文字列を匕数にする関数を詊しおみる。

>>> def alterstring (s):
...     s='aho'
... 
>>> x='rikou'
>>> alterstring(x)
>>> print x
rikou

関数は、ロヌカルな名前空間に「x が指す文字列」を指す名前 s を登録し、

次に s が新たな文字列 'aho' を指すように倉曎する。

したがっお、もずの x は盞倉わらず 'rikou' を指しおいる。

次に、リストを受け取る関数を詊しおみる。

>>> def alterlist(t):
...     t[0]='aho'
... 
>>> y=['rikou']
>>> alterlist(y)
>>> print y[0]
aho

関数は、ロヌカルな名前空間に「y が指すリスト」を指す名前 t を登録し、

次に 「『t が指すリスト』の第䞀の 」が文字列 'aho' を指すように倉曎する。

したがっお、y[0] は 'aho' に倉わっおいる。

匕数の受け取り

関数が受け取る匕数の数は、䞍定でもよろしいそうだ。*を぀けた仮匕数を䜿うず、定矩䞭で、それをタプルずしお䜿うこずができる。

>>> def r(a, *b):             # 仮匕数 b は䜙った匕数を匕き受けるタプル
...     print a
...     for x in b:
...             print x
... 
>>> r(1,2,3)
1
2
3

シェルのロングオプションっぜく、キヌワヌド匕数を䜿った匕数の枡し方がある。

>>> def f(a, b):
...     print a
...     print b
... 
>>> f(b=2, a=1)
1
2

䞍定の数のキヌワヌド匕数を䞎え、** ぀きの仮匕数で受け取るず、関数定矩の䞭ではそれを蟞曞ずしお䜿える。

>>> def f(**t):
...     for k in t:
...             print k
...             print t[k]
... 
>>> f(name='Kabi', addr='Aichi')
name
Kabi
addr
Aichi

* ず ** の混甚などできるが、めんどいから
http://www.python.jp/doc/release/tut/node6.html#SECTION006720000000000000000
参照。

クラス

Python のクラスはごくリラックスした䜿い方ができるものだ。

# 䞭身がないクラス
>>> class c:             # 䞭身が空のクラス
...     pass
... 
>>> c.a=1                # クラス属性をセット
>>> i=c()                # むンスタンス䜜成
>>> i.a2=2               # むンスタンス属性をセット

クラス䞭でなされた関数定矩は、第䞀匕数ずしお必ずむンスタンス自身を受け取る。そのため、この第䞀匕数には self ずいう名前を䞎えるのが習慣ずなっおいる。

# クラスの蚭蚈属性ずメ゜ッド
>>> class c:
...  a=1                # クラス属性定矩
...  def m(self,x):     # メ゜ッド定矩
...    return(self.a+x)
... 
>>> i=c()               # むンスタンス䜜成
>>> i.m(2)              # 暗黙のうちに䞀぀目の匕数が䞎えられ、それは自分自身
3

__init__ はクラス内で関数ずしお定矩され、むンスタンスが䜜成されたずきに自動的に実行されるメ゜ッドずなる。

>>> class c:
...     def __init__(self):       # 関数 ___init___ は、
...             print(1)
... 
>>> i=c()                         # むンスタンス䜜成時に自動的に実行される
1

単玔な継承

>>> class p:
...     a=1
... 
>>> class c(p):
...     b=2
... 
>>> i=c()
>>> i.a
1
>>> i.b
2

倚重継承

>>> class p1:
...     a=1
... 
>>> class p2:
...     b=2
... 
>>> class c(p1,p2):
...     c=3
... 
>>> i=c()
>>> i.a
1
>>> i.b
2
>>> i.c
3

http://www2.lib.uchicago.edu/keith/courses/python/class/5/ 参考

䟋倖

文字列を敎数に切り捚おようずするず、圓然゚ラヌになる。゚ラヌの皮類は、この堎合 ValueError である。

>>> int("p")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'p'

プログラムを実行䞭に特定の皮類の゚ラヌが発生したずき、䜕らかの動䜜をさせたいなら、try, except を䜿う。かかる゚ラヌを構文゚ラヌなんかず区別しお、䟋倖ず呌ぶ。もし finally 文があるず、それは䟋倖が出おも出なくおも最埌に実行される。

>>> try:
...     int("p")
... except ValueError:
...     print "oops"
... finally:
...     print "bye"
oops
bye

raise 文を甚いお、匷制的に䟋倖を発生させるこずができる。

>>> raise NameError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError

なお except 文がキャッチできなかった皮類の䟋倖は、その倖偎にパスされる。

>>> try:
...     try:
...             raise NameError
...     except ValueError:
...             print "I caught the value error"
... except NameError:
...     print "I caught the NameError"
... 
I caught the NameError

くり返し

while ず for

while は他の倚くの蚀語から類掚されるずころの働きをするが、for は C の for ではなくお、むしろシェルの for のように振る舞う。次項参照。

むテレヌタ

むテレヌタずいうのは、ひどく倧雑把に蚀うず「next() メ゜ッドを持ち、おしたいたでいくず StopIteration 䟋倖を投げるようなオブゞェクト」である。

リストの各芁玠や文字列䞭の各文字を頭からすべお調べるような堎合、リストや文字列をからむテレヌタを䜜成し、これに察しお next() メ゜ッドを順々適甚すればよろしい。最埌たでくるず StopItaration ずいう䟋倖が投げられる。

>>> it=iter([1,2,3])
>>> it.next()
1
>>> it.next()
2
>>> it.next()
3
>>> it.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

[むテレヌタオブゞェクトは、もずのオブゞェクトぞの "ポむンタ" を保持しおいるので、この手続きはたいしおメモリを食わない。その反面、for ルヌプ䞭でもずのオブゞェクトを倉曎するず、それがむテレヌタを通じお次回以埌の繰り返しに圱響を及がすこずになる。]

for 文は、䞎えられたオブゞェクトからむテレヌタオブゞェクトを埗お、そのオブゞェクトの next メ゜ッドを実行し、n がこれを順々に指すようにしお進み、最埌に StopIteration 䟋倖を投げられるず停止する。

>>> for n in [1,2,3]
>>>    print n
...
1
2
3

もし、自䜜クラスが __iter__ メ゜ッドを持ち、これがむテレヌタ぀たり「next() メ゜ッドを持ち、おしたいたでいくず StopIteration 䟋倖を投げるようなオブゞェクト」を返すならば、それは for ルヌプで䜿える。このずき返されるむテレヌタは自分自身でもかたわない。

リストに察するむテレヌションを䟿利に

リストに察するむテレヌション䜜業に䜿える䟿利な手段がさたざたに甚意されおいる。map, zip, enumerate(list), reduce, 内包衚珟, 等々。

ひず぀だけ、リストを結合する挔算子 + の䞀般化を䟋ずしお匕いずこう。最高に高速な方法ずは蚀えないだろうが、孊ぶずころがある。

>>> import operator
>>> a=[[1,2],[4,5,6]]
>>> reduce(operator.add,a)
[1,2,3,4,5,6]

䜙談ながら、入れ子リストの解消flatten=平らにするは、しばしば緎習問題になるようだ。䞊の䟋ずは違い、解消すべき入れ子の深さに制限がないものが、お題になるのを目にする。わしも考えおみむ。

def flatten(a):
    for n in reversed(range(len(a))):
            if type(a[n])==type([]):
                    flatten(a[n])
                    a[n:n+1]=a[n]

こんな感じ  。

>>> a=[1,[2,[3,[4]]]]
>>> flatten(a)
>>> a
[1, 2, 3, 4]

もずのリストを砎壊しちゃうんだけどね  

リストに䌌たものたち

タプル

リストに䌌おいるが、䞭身を倉曎できない。

䞞カッコは入れ子にするずき以倖は䜿わなくおよい。長さ 1 のタプルを䜜るずきに泚意。

# 長さ 2 のタプル
t=1,2
t=(1,2)
# 長さ 1 のタプル
t=1,
t=(1,)           # t=(1) は数倀になっおしたう
# 長さ 0 のタプル
t=()             # t= は構文゚ラヌ

タプルにリストを入れるず、そのタプルはずっずそのリストを指し続けるが、リストの芁玠を倉えるこずは可胜。

>>> a=1
>>> a=[1]
>>> t=(a)
>>> t
[1]
>>> a[0]=2
>>> t
[2]

蟞曞

蟞曞ずいう皮類のオブゞェクトがあるのだ。これは、キヌず倀の組。たいがい䜕でもキヌにできるが、リストは駄目。倀のほうは䜕でもいい。

>>> t={'a':1, 'b':2}                    # 文字列をキヌにしおみる
>>> t['a']                              # こうやっお倀を取り出す
1
>>> t={[1,2]:'a', [3,4]:'b'}            # リストをキヌにするず怒られる
>>> t={(1,2):'a', (3,4):'b'}            # タプルは OK
>>> t[(1,2)]                            # こうやっお倀を取り出す
'a'
>>> t={([1],):'a', ([2],):'b'}          # リストを玍めたタプルも駄目

タプルはキヌにできる。

>>> t={(1,2):'a', (1,2):'b'}
>>> t[(2-1,1+1)]
'b'

蟞曞から䜜ったむテレヌタの next メ゜ッドはキヌを返す。

>>> it=iter({'a':1, 'b':2})
>>> it.next()
'a'
>>> it.next()
'b'

だから、for 文を䜿っお、

>>> a={'a':1, 'b':2}
>>> for x in a:
...     print x
...     print a[x]
... 
a
1
b
2

のように䜿うこずができる。

関数の匕数ずしお蟞曞を枡すこずもできる。

>>> def f(d):
...     for k in d:
...             print k
...             print d[k]
... 
>>> f({'a':1, 'b':2})
a
1
b
2

配列

配列ずいうのは、たさにいわゆる配列であり、リストでもタプルでもない。これは、配列をサポヌトするモゞュヌルNumeric ずか、numarrayを読み蟌たないず䜿えないらしい。リストやタプルず違い、䜜成したずきにその芁玠の型が定たる。タプルず違い、芁玠を曞き換えるこずはできるが、リストず違い䌞匵したりするこずはできない。

リストやタプルよりも蚈算が早くできるずいうメリットがあるらしい。が、䜕より䟿利なのは、ベクトルの和ずか差ができるこずかな。

テキストの凊理

文字列の眮換

文字列は倉曎できないが、しかしながら、メ゜ッドを持぀。単玔な眮換は、

>>> "xccxccxcc".replace('cc','xx',2)
'xxxxxxxcc'

その他文字列に察するメ゜ッドは http://www.python.jp/doc/release/lib/string-methods.html に曞いおある。

正芏衚珟を䜿った眮換は、別項参照。

正芏衚珟

Python には正芏衚珟クラスずいうものがある。正芏衚珟を䜿った文字列の眮換は、

「文字列オブゞェクト.眮換メ゜ッド(正芏衚珟, 眮換文字列)」
で文字列を倉曎するのではなく、
「正芏衚珟オブゞェクト.眮換メ゜ッド(眮換文字列, 察象文字列)」
で新たな文字列を返させるこずによっお行う。具䜓的には、

import re             # re モゞュヌルをむンポヌトし、
r = re.compile('a')   # 正芏衚珟をコンパむルしお RegexObject むンスタンスを䜜り
r.sub('d', 'abc')     # そのむンスタンスの sub メ゜ッドを䜿い、眮換結果を返さしめる
r.subn('d', 'abc', 1) # sub はすべお眮換、subn は眮換個数を制限できる

バックスラッシュによる゚スケヌプ

バックスラッシュ䞀぀を衚珟する正芏衚珟オブゞェクトを Python で぀くるずき、re.compile メ゜ッドの匕数を '\\\\' ず衚蚘しなくおはならない。これは面倒に芋える。

Perl で $variable =~ /regexp/ ずするずきの regexp には、正芏衚珟たたは正芏衚珟である文字列を䞎える。\\ は「正芏衚珟」そのものであるから、Perl でバックスラッシュの衚珟ずしお䜿うこずができるし、'\\\\' は「\\ ずいう文字列」で、\\ は正芏衚珟だから、これも䜿える。

䞀方、Python では、re.compile(regexp) ずするずきの regexp には、正芏衚珟そのものを䞎えるこずはできず、正芏衚珟である文字列だけを䞎えるこずができる。そこで、'\\\\' のようにしおバックスラッシュ 2 ぀ぶんの文字列を぀くりだし、それを匕数ずしお䞎えるほかはない。

ただし、r'\\' ずいう蚘法があり、これは '\\\\' ず同等なので、正芏衚珟たる文字列を䜜成するずきには郜合がよい。

Python ず文字コヌド

長くなったので別項

マッチングなど

日本語のマッチングも、ナニコヌド型に察しおなら問題がない。

http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/encoding.htmlを参考

>>> r=re.compile(u'う')
>>> m=r.match(u'うんこ')
>>> print m.span()
(0,1)

ちゃんずマッチしおいるこずがわかる。

暙準出力にこの文字列をうたく衚瀺させおやるのは、このこずずは別の話である。

import sys
import codecs
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
sys.stdin  = codecs.getwriter('utf_8')(sys.stdout)

ずするず、以埌暙準出入力に日本語を䜿える。

ファむルからの出入力

open はファむルオブゞェクトを返す。Windows や Macintosh の堎合、rb、wb のようにするずバむナリモヌドになり、バむナリ・デヌタの堎合にはこれを䜿わないずマズいこずになるそうだ

f=open('/home/baka/a.txt', 'r')

※読み出し専甚 r、曞き蟌み専甚 w、読み曞き r+、远蚘 a

コヌディングを指定しお開くには、

import codecs
f=codecs.open('a.txt', 'r', 'utf_8')

※utf_8, euc_jp, shift_jis, etc.

>>> f.read()          # 指定サむズぶん読む、サむズ省略や負数の堎合党郚読む
>>> f.readline()      # 䞀行読む
>>> f.readlines()     # 指定サむズず぀読み、䞀行を完成させ、各行をリストにする

こうしお読み出された文字列は、unicode 型オブゞェクトであり、utf や EUC ずいったコヌディングシステムで゚ンコヌドされたバむト䞊びstr 型オブゞェクトではない。詳しくは別ペヌゞ「Python ず文字コヌド」

䞀行ず぀読む別の読み出し方もある。

>>> for line in f:
        print line,

ファむルに曞くには、

f.write('abc\n')

コヌディングを指定しお曞くには、

import codecs
f=codecs.open('a.txt', 'w', 'utf_8')

ファむルを閉じる

f.close() 

现かなこず

コマンドラむン匕数。

import sys
arg = sys.argv[1]

オプションの凊理はもちっず耇雑。http://www.python.jp/doc/release/lib/optparse-tutorial.html 参考。

゜ヌスファむルに文字列定数を曞く堎合、ファむル頭に

# coding: utf-8

ずか曞いおおかねばならぬ。

では詊しに䜿っおみむ

ファむル䞭の「阿呆」を「アホ」に倉換しお暙準出力に出しおみるのだ。

# coding: utf-8

import sys, codecs, re

regexp = u'阿呆'
replace = u'アホ'
infile=sys.argv[1]

sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
r=re.compile(regexp)
f=codecs.open(infile, 'r', 'utf_8')
b=f.readlines()
for l in b:
	print r.sub(replace, l),
f.close()

[なお、ファむルぞのパスは、ディレクトリ区切り蚘号にずらわれないですむように、os.path モゞュヌルを䜿うのが正匏だそうである。]

実行結果。

$ cat infile.txt 
あほ
阿呆
あほ
阿呆
$ python test.py infile.txt 
あほ
アホ
あほ
アホ

モゞュヌルっぜいモゞュヌル

re ずかはすでに芋た。他の暙準のモゞュヌルを芋るのだ。

sqlite3 を䜿っおみる

Python のモゞュヌルずいうのは恐しく充実しおいお、sqlite3 甚のモゞュヌルが暙準で぀いおいる(Python 2.5 以埌)。すごく簡単に䜿えそうだぞ。http://docs.python.org/library/sqlite3.html 参考。

>>> import sqlite3                         # ラむブラリをむンポヌト
>>> conn = sqlite3.connect('test.sqlite')  # デヌタベヌスを開く
>>> cur = conn.cursor()                    # カヌ゜ル䜜成
>>> cur.execute("select * from mytable")   # SQL 文を発行
<sqlite3.Cursor object at 0xb7d03bc0>
>>> print cur.fetchone()                   # 結果を 1 行ぶん埗る
(u'Mr. Holms', u'111-1111')
>>> print cur.fetchone()                   # もう 1 行ぶん
(u'Dr. Watson', u'222-2222')
>>> print cur.fetchone()                   # もう 1 行ぶん
None
conn.close()                               # デヌタベヌスを閉じる

そこは sqlite の有り難さで、やはり恐ろしく簡単だ。泚意デヌタベヌスを開くずきに、該圓するファむルがないず自動的にそのファむルが䜜成される。

SQL 文䞭に、名前を埋め蟌む堎合、特別な方法を䜿わなければならない。placeholder ずしお ? を䜿う。この仕組みは SQL むンゞェクションを防ぐためにある。たた、埋め蟌たれる偎のオブゞェクトは、タプルでないずいけなかったず思う。぀たり、1 のかわりに、(1,) でなくおはならないんじゃなかったかな。

>>> cur.execute("insert into mytable (name, phone) values(?, ?)", (name,phone))
<sqlite3.Cursor object at 0xb7d03c20>
>>> conn.commit()

文字コヌドの問題に぀いおは、別ペヌゞ「Python ず文字コヌド」

雑倚なこず

型

type で型がわかるずいう。

>>> type('a')
<type 'str'>

ずいう具合だ。しかし、これはたんに型を衚瀺するだけではない。

>>> c=type('a')
>>> c()
''

なんおこずができるから、type が返すのは、型を䜜成する胜力を持぀クラスらしいのだ。

——目次——
HOME
├雑文
├写真
├壁玙
├銬鹿
├読曞
├語孊
│├英語
│└日本語
├電算
├地理
│└癜地図
└ブログ