Skip to main content

7 posts tagged with "Module"

View All Tags

Python: テキストファイルの行頭に行番号を追加

· One min read
Yu Sasaki
Enterprise Security Manager / Advisor

コマンドラインで指定されたテキストファイルの行頭に行番号を追加し、そのデータを新たなファイルに書き出すスクリプトです。

ソースコード

#!/usr/bin/python
# coding: UTF-8
import sys
argvs = sys.argv
argc = len(argvs)
if (argc != 3):
print 'Usage: $ python %s target_file making_file' % argvs[0]
quit()
f = open(argvs[1])
lines2 = f.readlines()
f.close()
nf = open(argvs[2], 'w')
i = 1
for line in lines2:
nf.write('%3d: %s' % (i, line))
i = i + 1
nf.close()

仮にこのソースコードをfile05a.pyというファイルで保存した場合、使用する際はプロンプトに以下のように打ち込みます。

実行結果

プロンプト

> python file05a.py file05a.py file05a-l.txt

この結果、生成されたファイルが下記になります。

file05a-l.txt

1: #!/usr/bin/python
2: # coding: UTF-8
3:
4: import sys
5:
6: argvs = sys.argv
7: argc = len(argvs)
8: if (argc != 3):
9: print 'Usage: $ python %s target_file making_file' % argvs[0]
10: quit()
11: f = open(argvs[1])
12: lines2 = f.readlines()
13: f.close()
14: nf = open(argvs[2], 'w')
15: i = 1
16: for line in lines2:
17: nf.write('%3d: %s' % (i, line))
18: i = i + 1
19: nf.close()

Python: コマンドライン引数の取得 - sys.argv変数

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

コマンドラインで与える引数によってプログラムの挙動を変えたいという場面はよくあります。Python ではコマンドライン引数は sys モジュールの argv 属性に文字列を要素とするリストとして格納されています。そして、リストの先頭要素(sys.argv[0])はスクリプトファイル名となっています。

ソースコード

# coding: Shift_JIS
import sys # モジュール属性 argv を取得するため
argvs = sys.argv # コマンドライン引数を格納したリストの取得
argc = len(argvs) # 引数の個数
# デバッグプリント
print argvs
print argc
print
if (argc != 2): # 引数が足りない場合は、その旨を表示
print 'Usage: # python %s filename' % argvs[0]
quit() # プログラムの終了
print 'The content of %s ...n' % argvs[1]
f = open(argvs[1])
line = f.readline() # 1行読み込む(改行文字も含まれる)
while line:
print line
line = f.readline()
f.close

text.txt

It is meaningless only to think my long further aims idly.
It is important to set my aims but at the same time I should confirm my present condition.
Unless I set the standard where I am in any level, I'll be puzzled about what I should do from now on.

実行結果

引数を指定しない場合

$ python argv01.py
['argv01.py']
1
Usage: # python SCRIPTNAME.py filename

引数を指定した場合

$ python argv01.py text.txt
['argv01.py', 'text.txt']
2
The content of text.txt ...
It is meaningless only to think my long further aims idly.
It is important to set my aims but at the same time I should confirm my present condition.
Unless I set the standard where I am in any level, I'll be puzzled about what I should do from now on.

リファレンス

Python: SQLiteにデータを格納、検索、出力 - pysqlite

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

レコードの検索や格納処理性能がオープンソースのDBで間に合う程度の問題であれば、積極的に使っていきたいです。それによって、他のロジックのコーディングに傾注できます。また、DBという共通のプラットフォームは複数言語から扱えますので、データの再利用がしやすいです。 さて、今回はPythonからSQLiteを扱うサンプル(pysqliteの使い方)を書いてみます。

ソースコード

# coding: UTF-8
from pysqlite2 import dbapi2 as sqlite
# データベースに接続(作成)
con = sqlite.connect('test1.db')
# テーブルの列要素: 名前、性別(male or female)、年齢
con.execute('CREATE TABLE people (name TEXT, sex TEXT, age INTEGER)')
# テストデータの挿入(1行はタプルで)
con.execute('INSERT INTO people VALUES ("Taro", "male", 22)')
con.execute('INSERT INTO people VALUES ("Hanako", "female", 38)')
con.execute('INSERT INTO people VALUES ("Ranka", "female", 17)')
con.execute('INSERT INTO people VALUES ("Ozuma", "male", 40)')
con.commit() # DBに反映
# データの検索
cur = con.execute('SELECT * FROM people')
# データの出力
print 'NAMEt SEXt AGE'
for row in cur:
print '%-8s %-6s %2d' % row # 1行のデータ構造はタプル
con.close()

実行結果

NAME SEX AGE
Taro male 22
Hanako female 38
Ranka female 17
Ozuma male 40

Magic Workstation にインポートするオリジナルカードの作成スクリプト

· 6 min read
Yu Sasaki
Enterprise Security Manager / Advisor

Magic Workstation(MWS)という対戦カードゲームMagic: The Gatheringが出来るソフトがありますが、その機能の一つにオリジナルカードのインポート機能があります。カードの作成方法はテキストファイルに規定の書式で書いていけばいいのですが、自動化できるところがありましたので、即席ですがスクリプトを書いてみました。

SpoilerMaker.py

Python: lxmlのインストール方法

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

lxml とはXMLやHTMLを扱うPythonのライブラリの一つです。

lxml is the most feature-rich and easy-to-use library for working with XML and HTML in the Python language. - lxmlの冒頭の文より

linux系OS(Fedoraなど)の場合

# yum python-lxml

も一つの手ですがバージョンが古いので、通常はeasy_install経由でlxmlをインストールします。 前段階として、easy_installをインストールするためにhttp://peak.telecommunity.com/dist/ez\_setup.pyをダウンロードしてスーパーユーザで実行します。

# python ez_setup.py error: invalid Python installation: unable to open /usr/lib/python2.5/config/Makefile (No such file or directory)

上のようなエラーがでた場合はpython-develをインストールします。また、合わせてlxmlに必要なパッケージもインストールするには以下のようなコマンドを実行します。

# yum install python-devel libxml2* libxslt*

改めて、

# python ez_setup.py

完了後、easy_installコマンドが実行できるようになります。 lxmlのインストールは以下のコマンドを実行すればOKです。

# easy_install lxml

ライブラリの確認方法は、

$ python
>>> import lxml
>>>

でエラーが出なければOKです。

アンインストール方法

以下のコマンドを実行。

# easy_install -mxN lxml

Windowsの場合

Webアプリのデプロイ環境はLinux系だけれど、開発やテストの一部はWindows機で行いたいのでWindowsにeasy_installでインストールしようとしましたが、途中でエラーが出て中々上手くいきませんでした。 解決に時間が掛かりそうだったので、とりあえずPython Package Index : lxml 1.3.4のlxml-1.3.4.win32-py2.5.exeをダウンロード&インストールして済ませました。

参考にした記事

Python: モジュールにテスト関数を定義 - 重複のない乱数(整数MIN以上MAX以下)の生成

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

#!/usr/bin/python
# coding: UTF-8
import random
def make_randint_list(min, max, cnt, sortflag=False, revflag=False):
"""
重複のない乱数(整数min以上max以下)を要素としたリストを返す
"""
list = []
i = 0
while cnt != i:
r = random.randint(min, max)
try:
list.index(r) # 既にリストに存在するか
except ValueError, e:
list.append(r) # 無い場合はリストに格納
i = i + 1
if (sortflag): list.sort(reverse=revflag)
return list
def _main():
"""モジュールのチェック関数"""
print 'makerand0.py [_main()]'
print make_randint_list(10, 99, 10)
print make_randint_list(10, 99, 10, True) # 昇順ソート
print make_randint_list(10, 99, 10, True, True) # 降順ソート
if __name__ == '__main__' : _main()
#

モジュール変数__name__の中には通常はモジュール名が入っています。しかし、このモジュールファイルを直接実行した場合は__name__に'__main__'という名前が入ります。その為、if __name__ == '__main__' : は真となり_main()が実行されます。

実行結果

$ python makerand0.py
makerand0.py [_main()]
[62, 18, 55, 44, 97, 67, 87, 16, 59, 43]
[11, 13, 30, 42, 46, 52, 71, 75, 81, 92]
[88, 81, 65, 60, 57, 53, 41, 34, 27, 23]

モジュールテスト用スクリプト

makerand0_test.py

#!/usr/bin/python
# coding: UTF-8
from makerand import make_randint_list
print make_randint_list(10, 99, 10)
print make_randint_list(10, 99, 10, True)
print make_randint_list(10, 99, 10, True, True)

実行結果

$ python makerand0_test.py
[52, 44, 63, 61, 50, 66, 88, 45, 99, 57]
[15, 26, 29, 53, 56, 69, 89, 91, 94, 95]
[96, 95, 93, 88, 79, 75, 64, 62, 33, 11]

リファレンス

チュートリアル

Python: 乱数の生成 - random()、randint()、uniform()、seed()メソッド

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

#!/usr/bin/python
# coding: UTF-8
# 乱数の生成 | random()、randint()、uniform()、seed()メソッドの使い方
import random # モジュールのインポート
print random.random(), 'n' # 0.0 ≦ F < 1.0 の浮動小数点数をランダムに返す
# randint(x, y)メソッド: 整数x以上y以下(x ≦ N ≦ y)の乱数を返す
for i in range(10):
print random.randint(10, 20), ' ',
print 'n'
# uniform(x, y)メソッド: 実数x以上y未満(x ≦ N < y)の乱数を返す
for i in range(10):
print random.uniform(10, 20)
print
# seed()メソッド: 乱数の種の初期化
# (省略した場合はシステムの現在時刻で初期化が行われる)
random.seed(1) # 明示的に初期化
for i in range(10):
print random.randint(10, 20), ' ',
print 'n'
random.seed(1) # もう一度初期化(結果は上と同じとなる)
for i in range(10):
print random.randint(10, 20), ' ',
print 'n'

実行結果

0.610071743263
16 16 15 11 19 16 10 11 20 18
12.8745815718
10.3223430071
10.9674507421
17.5459589302
16.0796539779
15.0854025011
18.6344006559
11.049275088
16.6396732404
12.0720922586
11 19 18 12 15 14 17 18 11 10
11 19 18 12 15 14 17 18 11 10

リファレンス