Pythonを勉強中 vol.11

最近忙しく全然更新する暇が無くなってきた。。。

今やってる事は人生掛かっているので、
しょうがないっす!

ってことでPythonでファイルを読み込んでみるってのを
やってみた。

入力ファイルのオープンは

input = open(‘ファイル名’, ‘r’)

出力ファイルの作成・オープンは

output = open(‘ファイル名’, ‘w’)

ファイルの読み込みは

input.read()

ってのをふまえてやってみる。
まずテスト用にファイルを作成する。
今回は「test.html」ってのを作った。

>>> input = open(‘test.html’, ‘r’)
>>> print input.read()
<html>
<body>
<div>
<p>testだよ</p>
</div>
</body>
</html>

ちゃんと読み込んでいる。

次にファイルを作成し、書き出してみる。

>>> output = open(‘test.html’, ‘w’)
>>> output.write(‘<html><body><div><p>hogehoge</p></div></body></html>’)
>>> output.close()
>>> input = open(‘test.html’, ‘r’)
>>> print input.read()
<html><body><div><p>hogehoge</p></div></body></html>

ちゃんと上書きされている。

さっきのファイルを違う形で読み込んでみる。
今回は「for」を使用した。
「while」でも出来るが「for」の方が一行ずつ読み込む場合は、
簡単に掛けて実行速度も速い。

>>> for char in open(‘test.html’).read():
… print char

<
h
t
m
l
>
<
b
o
d
y
>
<
d
i
v
>
<
p
>
h
o
g
e
h
o
g
e
<
/
p
>
<
/
d
i
v
>
<
/
b
o
d
y
>
<
/
h
t
m
l
>
>>>

うぉ!?
一文字ずつ読んでしまったw

>>> for line in open(‘test.html’).readlines():
… print line

<html><body><div><p>hogehoge</p></div></body></html>

これだと解りにくいな。
改行してからもう一回やってみる。

>>> for line in open(‘test.html’).readlines():
… print line

<html>

<body>

<div>

<p>

hogehoge

</p>

</div>

</body>

</html>

改行コードが入ってるのかな?
readlines()はファイル全体を読み込んで、
内容を文字列のリストにまとめるので、
改行もやはり入ってきちゃうのか。

ちなみに同じようにwhileでやってみた

>>> file = open(‘test.html’, ‘r’)
>>> while 1:
… line = file.readline()
… if not line: break
… print line,

<html>
<body>
<div>
<p>
hogehoge
</p>
</div>
</body>
</html>

追記

webooさんからコメントをいただき試してみました。

>>> for line in open(‘test.html’).readlines():
… print line.strip()

<html>
<body>
<div>
<p>
hogehoge
</p>
</div>
</body>
</html>

文末の余計な改行を削除するには、strip()を用いるって事ですね。
ありがとうござました。

追記2

MiCHiLUさんからコメントをいただき、
SrtingIOを調べてみて試してみました。

StringIOとは、ファイルのように文字列を読み書きする。

つまり

>>> print open(‘test.html’).read()
<html>
<body>
<div>
<p>
hogehoge
</p>
</div>
</body>
</html>

forで位置一行ずつ読み込むと

>>> for line in open(‘test.html’).readlines():
… print line.strip()

<html>
<body>
<div>
<p>
hogehoge
</p>
</div>
</body>
</html>

となってしまうが、
StringIOを使うとファイルのように読み書きするので、

>>> input = StringIO.StringIO(open(‘test.html’).read())
>>> for line in input.readlines(): print line,

<html>
<body>
<div>
<p>
hogehoge
</p>
</div>
</body>
</html>

こんな感じっす。
まさにファイル通りちゃんとインデントも
読んでいるっす。

いい感じです。
あいがとうございました!

ついでにStringIOにはgetvalueというメソッドがあるので、
こちらも試してみた。

>>> input.getvalue()
‘<html>\n <body>\n <div>\n <p>\n hogehoge\n </p>\n </div>\n </body>\n</html>\n’

こちらはファイルの中身全体を返すので、
改行なども含まれて返してくれるっす。

あとは、
closeにてメモリを解放するっす。

>>> input.close()

Pythonを勉強中 vol.10

今日もDjango関係で、

Pythonを勉強っす。

今回ブログにタグクラウドを表示させたかったので、

作成。

基本は、kjirouさんのブログを参考にしました。(パクリっす。)

まずは、

・最もタグ付けされている回数が多いタグの回数
・最もタグ付けされている回数が少ないタグの回数

を取得する。

で後は格タグに文字の大きさのレベルを付ける。
これもパクリ。

この時に平方根を算出するが、
どれを使えば良いのかが解らなかったので調べてみる。

あるじゃん良いのがw

math.sqrt

こいつで平方根を簡単に算出出来る。

>>> import math
>>> math.sqrt(1)
1.0
>>> math.sqrt(2)
1.4142135623730951
>>> math.sqrt(3)
1.7320508075688772

なるほど。
これは便利っすね。

後ceilもあった。

>>> math.ceil(math.sqrt(3))
2.0

繰り上げ。

他にもあるみたいのなので、
色々と試してみようっと。

とりあえずタグクラウドは出来たので満足。

Pythonを勉強中 vol.9

この間は脱線してしまったので、
今日はPythonのディクショナリを
試してみる。

ディクショナリとは?

オブジェクトの集合というのは、
リストと同じ。

だがリストと違い、
要素へのアクセスに数字では無く、
キーを使用する。
順不同なので、連結やスライシングが出来ない。

なので、
ディクショナリは「連想配列」や「ハッシュ」とも
呼ばれる事があるみたい。

簡単に試してみる。

>>> d = {‘kool’:1, ‘malboro’:2, ‘mildseven’:3}
>>> d[‘kool’]
1

要素数の確認

>>> len(d)
3

キーの確認

>>> d.has_key(‘kool’)
True

もしくは、

>>> ‘kool’ in d
True

キーのみのリストを作成

>>> d.keys()
[‘mildseven’, ‘malboro’, ‘kool’]

値のみのリストを作成

>>> d.values()
[3, 2, 1]

キーと値のペアでタプルのリストを作成

>>> d.items()
[(‘malboro’, 2), (‘kent’, 5), (‘kool’, 1)]

要素の削除

>>> del d[‘mildseven’]
>>> d
{‘malboro’: 2, ‘kool’: 1}

要素の追加

>>> d[‘kent’] = 5
>>> d
{‘malboro’: 2, ‘kent’: 5, ‘kool’: 1}

2つのディクショナリを連結しマージする

>>> d2 = {‘kool’:1, ‘camel’:10, ‘caster’: 22}
>>> d.update(d2)
>>> d
{‘kent’: 5, ‘kool’: 1, ‘caster’: 22, ‘camel’: 10, ‘malboro’: 2}

‘kool’:1が両方に入っていたので、
重複するものは連結されずそれ以外の値が
連結される。

ディクショナリをPHPのforeachみたいに
使ってみる。

PHPだと、

$array = array(‘dog’ => 1, ‘cat’ => 2, ‘lion’ => 3);
foreach ($array as $key => $value) {
 print $key;
}
dog
cat
lion

Pythonだと

>>> d = {‘kent’: 5, ‘kool’: 1, ‘caster’: 22, ‘camel’: 10, ‘malboro’: 2}
>>> for key in d:
… print key

kent
kool
caster
camel
malboro

っすね。

Python Unconference Tokyo 1 に行ってきたっす

まだまだPythonは勉強中の身ですが、

行ってきたっす。

内容は

・Pylonsとその仲間たち
・GoogleGears
・Gearmanでプログラムの壁を越えろ
・PyTCで学ぶPython C拡張の書き方
・habuの紹介

です。

率直な意見はとりあえず自分で試さないと。。。
なぜって?
物わかりの悪い子だからw

Pylonsの話を聞いて

wsigに準拠したフレームワーク。

たくさんの外部パッケージに依存する。

ひな形がすごい使いやすいので(ベースにする)
それだけでも使う価値がある。

ソースコードは27個(.py)
なぜ小さくてすむのか。→ wsgiのアプリケーションだから

とりあえず試さないとなぁ〜

easy install Pylons

GoogleGearsの話を聞いて

ブラウザのプラグイン。
・firefox
・safariなど
キャッシュをしてくれる。

・LocalServer
・Databse(SQLLiteベース)
・WakerPool

サーバー側がDjango
jsonで吐き出している。

クライアント側はjavascript

ソースはGoogleコードで公開されている。

これはすごい興味を持った。
確かにネットが繋がらないなどの状況は、
多々あるはずのなので必須になりそう。

Geamanの話を聞いて

Danga=分散

とりあえず分散がこれからは来る!

PyTCの話を聞いて

tokyocabinetのpyhtonのバインディング

データベースシステム

パーフォマンス
結構良い

・ctypes

windows
python2.5に標準モジュール

コンパイル要らず

実用するにはpythonでラップする必要がある。

・swig

移植性が高い
phpは4のみ
C++と相性が良い

・pyrex

python+αで拡張モジュールが書ける
コールバックも書ける
これが一番おすすめらしい

・Cの拡張モジュール

pythonC APIを使って書く

・Cで書くときの方針

pythonでラッパを必要としないようにした
これはラッパすると処理が重くなるため

habuの話を聞いて

perlで実装されているplaggerもどき

懇談会にも出席してきました。
Python温泉などで会った人も結構居たっす。
何回か会ってるのに名刺を交換して無かったので、
この機会に何人かの方と交換しました。
やっぱりこういう所に顔を出し話を聞くと、
色々と見えてくるものがある。
楽しかったっす♪

次のPython関係は鍋です。
来年にまたあのPython温泉があるので、
是非参加する方向で。

pythonを勉強中 vol.7

今日もPythonを勉強。

基本的な事しかしてませんが・・・

知識に成れば良い!

ってことで、

前回やったリストなんかと同じ「オブジェクトの集合」の

「タプル」

これって本を読んでると、

ん?

リストがあるから要らなくね?

って思ってたのが大間違い。。。

不変性ようは変更不能です。

これ大事っすね。

後は、

メソッドがない。

しかしシーケンスオブジェクトなので、
下記のような操作は出来る。

>>> (1,2)+(3,4)
(1, 2, 3, 4)

>>> (1,2)*4
(1, 2, 1, 2, 1, 2, 1, 2)

>>> x = (1,2,3,4,5)
>>> len(x)
5

しかし、

>>> y = [1,2,3,4,5]
>>> y.reverse()
>>> y
[5, 4, 3, 2, 1]

こういうのは出来ないので、

>>> x.reverse()
Traceback (most recent call last):
File “”, line 1, in
AttributeError: ‘tuple’ object has no attribute ‘reverse’

って怒られる。

なので、

一度タプルをリストに変換してから、
ソートやリバースする。

>>> l =list(x)
>>> l.sort()
>>> l
[1, 2, 3, 4, 5]
>>> l.reverse()
>>> l
[5, 4, 3, 2, 1]

それからタプルに変換する。

>>> t = tuple(l)
>>> t
(5, 4, 3, 2, 1)

おぉ〜戻ったっす。

後はタプルで大事そうな事が書いてあった。

リストはディクショナリのキーになれないが、
タプルはなれる。

これも覚えておかないとなぁ〜。