naobe @ ウィキ
python
最終更新:
Bot(ページ名リンク)
-
view
言語に戻る
対象バージョン
3.3
インストール
- http://www.python.org/download/からPython 3.3.1 bzipped source tarball (for Linux, Unix or Mac OS X)を選択しダウンロード
- 解凍
- configure, make, make install
- tkinterが動かない。さんざん悩んで、原因はtcl/tkのdevelがないこととわかる。yumを使ってdevelをインストール
- sudo python setup.py install
tkinterは、pythonとは別にインストールしなければならないと思い込み、tkinterのダウンロードサイトを探し続けていた。python3.3の中にあるとは知らなかった。
比較操作
比較操作間に優先順位はない。比較演算子は算術演算子、ビット演算子、シフト演算子より優先順位は低い。
要素が数値なら大小を比較する。要素がバイトなら数値に変換して大小を比較する。要素が文字ならUTFコードを数値に変換して大小を比較する。
要素の型が異なると、例外を発生する場合がある。int型と文字型の比較はNG。
要素が数値なら大小を比較する。要素がバイトなら数値に変換して大小を比較する。要素が文字ならUTFコードを数値に変換して大小を比較する。
要素の型が異なると、例外を発生する場合がある。int型と文字型の比較はNG。
| 項目 | 説明 |
|---|---|
| a < b | |
| a > b | |
| a < b < c | |
| a == b | |
| a >= b | |
| a <= b | |
| a != b | |
| a is [not] b | notなしのとき、aとbが同じオブジェクトのときTrue |
| a [not] in b | notなしのとき、aがbの要素ならTrue。 |
フロー制御
if
条件がTrueなら行を実行する。
if 条件: 行 (elif 条件: 行)* [else 行]
while
条件がTrueの間、行を実行する。
while 条件: 行 [break] [continue] [else: 行]
- 条件がfalseになると、elseを実行して終了する。
- breakを実行すると、elseを実行しないでループを抜ける。
- continueを実行すると、ループの先頭に戻る
for
リストの項目をターゲットリストに順次、代入して行を処理する。
for ターゲットリスト in リスト: 行 [break] [continue] [else: 行]
- リストがなくなると、elseを実行する
- breakを実行すると、elseを実行しないでループを抜ける。
- continueを実行すると、ループの先頭に戻る
ステートメント
ver.3から関数に移行。()が必要
| 書式 | 説明 |
|---|---|
| print x,y | x,yを標準出力に出力する。xとyの間には空白が入る。改行を出力する。 |
| print x,y, | x,yを標準出力に出力する。xとyの間には空白が入る。改行を出力しない。 |
| print フォーマット文字列 % タプル | C言語のprintf文と同じ。【例】print "%s...%s" % (x,y) |
| print >> f,x,y | ファイルfに、x,yを出力する |
組込オブジェクト
importしないで使えるオブジェクト
組込オブジェクトの型
| オブジェクトの型 | 例 |
|---|---|
| 数値 | 23,3.14,999L,3+4j,Decimal |
| 文字列 | 'abcd',"efgh" |
| リスト | [1,[2,3],4] |
| ディクショナリ | {'k1':'v1', 'k2':'v2} |
| タプル | (1,'a', 2,'b') |
| ファイル | myfile = open('f1', 'r') |
| その他 | set, type, None, bool |
文字列(stringオブジェクト)
シーケンスオブジェクト。不変オブジェクト(値を変えることができない)
| 項目 | 説明 |
|---|---|
| 結合 | 文字列+文字列【例】a='aaa';b='bbb';c=a+b。cは'aaabbb'になる。 |
| splice | 位置を指定して部分を抽出する。a[n:m]でnからm-1までを抽出する。【例】a = 'abcde';print a[1:3]は、'bc'を出力する。 |
| 分割 | a.split(sep)でsepを元に分割した配列を作成する。 |
| トリム | a.rstrip().lstrip() |
トリプルクォーテーション
シングルクォートまたはダブルクォート3個使って文字列を囲む。複数の行にまたがって文字列を指定できる。内部の改行は、文字列に含まれる。内部にシングルクォート、ダブルクォートを書いても良い(\を追加する必要がない)。
リスト
配列と同等のもの。可変オブジェクト。
| 項目 | 説明 |
|---|---|
| 作成 | a = [1,2,3,4,5]でリストaを作成する。要素はオブジェクト。a = []で空リスト作成。 |
| 要素の追加 | a[5] = 6 or a.append(6)。 |
| 要素の挿入 | a.insert(位置,要素) 【例】a.insert(0,0)。aは[0,1,2,3,4,5,6]になる。 |
| 抽出 | s[i:j:k] iからjまでステップkで抽出。 |
| 削除と抽出 | a.pop(位置)。位置を指定しないと、最後尾を指定したことになる。 |
| 削除 | del s[i:j] iからj-1までの要素を削除 |
| ソート | a.sort() a.reverse()。sortは昇順。reverseは逆順。 |
| splice | 文字列と同様 |
| 要素の個数 | len(list) |
| 要素のインデックス | a.index(要素) |
| インデックス配列の作成 | range(配列) |
| インデックスと要素配列の作成 | enumerate(配列)。【例】for i, t in enumerate(arry) |
内包
演算結果を配列の要素に設定する。記述がシンプルになる。
a = "a b c d e f"
b = [t for t in a.split(" ") if t]
ファイルオブジェクト
組み込み関数openによって返されるファイルを表すオブジェクト。
| メソッド | 説明 |
|---|---|
| read([size]) | ファイルからsizeバイト読み込んで文字列オブジェクトを返す。sizeがないときはファイルの最後まで読み込む。EOFを読み込むと空の文字列を返す。バイナリモードのときは空のbytesオブジェクト(if len(data) == 0で判定)。 |
ディクショナリ
perlのハッシュ。
| 項目 | 説明 |
|---|---|
| 作成 | a = {'key1':'val1', 'key2':'val2'}でディクショナリaを作成する。a = []で空リスト作成。 |
| 要素の追加 | a['key3'] = 6 |
| 要素の削除 | del d[key] |
| 要素の個数 | len(a) |
| 要素の存在確認 | if key in dict:存在。if not key in dict:存在しない |
関数
定義
defを使って定義する。
def func(a,b):
return a *b
print func(2,10)
【実行結果】
20
オブジェクトの参照渡し
引数にオブジェクトを渡すと参照が渡される。関数内でオブジェクトを操作すると、関数から戻った後も操作の結果は残る。
def func2(a):
a.pop()
a = [0,1,2,3,4,5]
func2(a)
print a
【実行結果】
[0, 1, 2, 3, 4]
オブジェクトとの関係
関数はオブジェクトとして扱われる。関数を変数(オブジェクト)に代入すると、関数の参照が渡され、変数を使って関数を実行できる。また関数の引数に関数を使用できる。
def func(a,b):
return a *b
a = func
print a(10,20)
【実行結果】
200
組込関数
モジュールを指定しないで使える関数のこと。
| 項目 | 書式 | 説明 |
|---|---|---|
| help | help(target)。 | ヘルプを表示する。targetには、取り込んでいるオブジェクトを指定する。 |
クラス
class クラス名でクラスを定義する。クラス(親クラス)とすると親クラスを継承したクラスを記述する。__init__はコンストラクタ。メソッドの最初の引数は、selfを指定する。クラス変数は、前もって定義しない。
class Person:
BASE_SALARY = 10000
def __init__(self, name):
self.name = name
def getSalary(self):
return self.BASE_SALARY
class Engineer(Person):
def getSalary(self):
return self.BASE_SALARY * 2
john = Person("john")
print john.name
print john.getSalary()
print
tom = Engineer('tom')
print tom.name
print tom.getSalary()
【実行結果】
john
10000
john
10000
tom
20000
20000
モジュール
.pyという拡張子を持ったファイル。
importを使ってモジュールをロードする。モジュールの属性を使うには、モジュール.属性とする。ファイルの拡張子は使わない。モジュールの中にクラス、関数、変数がある。
from モジュール import 属性とすると、モジュールを指定しなくて良い。
【例】
otherモジュールをロードして、bという変数を使用する。
importを使ってモジュールをロードする。モジュールの属性を使うには、モジュール.属性とする。ファイルの拡張子は使わない。モジュールの中にクラス、関数、変数がある。
from モジュール import 属性とすると、モジュールを指定しなくて良い。
【例】
otherモジュールをロードして、bという変数を使用する。
import other a = other.b from other import b a = b
モジュールは、モジュールサーチパスにあればロード可能。モジュールサーチパスは、sys.pathを参照する。環境変数PYTHONPATHを設定するとモジュールサーチパスにPYTHONPATHを追加する。
[suna@athlon4 python]$ export PYTHONPATH=~suna/language/python [suna@athlon4 python]$ python Python 2.4.3 (#1, Jan 9 2013, 06:49:54) [GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', '/home/suna/language/python', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/ usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/lib/python2.4/site-packages', '/usr/lib/python2.4/s ite-packages/Numeric', '/usr/lib/python2.4/site-packages/gtk-2.0'] >>>
パッケージ
ディレクトリがパッケージ。モジュールを整理するために使用する。パッケージディレクトリには、__init__.pyを作成する。__init__.pyは空でかまわない。__init__.pyにはパッケージに関連する初期処理(ファイル作成、DB接続等)を記述する。モジュールをimportしたときに__init__.pyを実行する。
__name__属性
モジュールファイルを実行したときに__main__が設定される。ファイルの最後に以下の記述をすれば、importモジュールとしても実行モジュールとしても使用できる。
if __name__ == '__main__': 実行するステートメント
モジュールとメソッド
| モジュール | オブジェクト | メソッド | 説明 |
|---|---|---|---|
| commands | 関数オブジェクト | getoutput(command) | コマンドを実行し、結果を返す。 |
| (status, output) = getstatusoutput(command) | コマンドを実行し、ステータスと結果を返す。 | ||
| re | 関数オブジェクト | compile(pattern[,flags]) | 正規表現パターンを使って正規表現オブジェクトを作成する。pattern:正規表現パターン。flags:re.I(大文字、小文字を区別しない),re.L(\w,\W,\b\Bを現在のロケールに合わせる。)、他はリファレンス参照。複数のフラグを適用するときは、ビット論理和(|)を使う |
| 正規表現オブジェクト | match(string) | stringが正規表現パターンにマッチしているときはマッチオブジェクトを返す。マッチしない場合は、Noneを返す | |
| sub(repl, str) | マッチしたパターンを使って対象文字列を書き換える。repl:書き換える文字列。後方参照文字(\1,\2,..)を使用できる。str:対象文字列 | ||
| io | ファイルオブジェクト | ||
用語
| 項目 | 内容 |
|---|---|
| シーケンス | 要素が順番に並んだオブジェクト。【例】文字列、リスト、タプル |
| タプル | 不変なリスト。a = (0,1,2)とすると、a[1] = 2とするとエラー。 |
正規表現
文字列が正規表現パターンに一致するか判定する
#!/bin/env python
# -*- coding:utf-8 -*-
import re
m = re.compile('a{3}b{3}')
if m.match('aaabbb') :
print "match"
else:
print "unmatch"
matchを出力する。
一致する部分を使って書き換える
#!/bin/env python # -*- coding:utf-8 -*- import re m = re.compile(r'key1:([0-9]+)\skey2:([0-9]+)') print m.sub(r'val2:\2, val1:\1', 'key1:100 key2:200') [foo@athlon4 python]$ ./t1.py val2:200, val1:100
エンコーディング
| 項目 | 説明 |
|---|---|
| utf-8 | |
| cp932 |
その他
| 項目 | 内容 |
|---|---|
| pydoc | pydoc target。オンラインヘルプ。UNIXのmanコマンドのようなもの。 |
| 標準入力 | |
| ドキュメンテーション文字列 | |
| モジュールサーチパス | sys.pathがモジュールサーチパス。import sys; print sys.path |
| 引数の取得 | sys.argvが引数のリスト |
| python2からpython3への変換 | 2to3.py -w スクリプトファイル。元のファイルは.bak。 |
サンプルプログラム
ファイルを読んで出力
"""
CSVファイルを読み込み、項目に分解する
"""
# ディレクトリ
DIR = "C:/Users/suna/Dropbox/programs/python/"
"""
行を項目に分解
@param line 行
@return 項目のリスト
"""
def parseLine(line):
# カンマで分解
terms = line.split(",")
# 返却するリスト
list = []
for term in terms:
# 先頭と、最後の空白を削除
term = term.strip()
term = term.rstrip()
list.append(term)
return list
"""
main
"""
f = open(DIR+"a.csv", "r")
while True:
# ファイルから1行読み込み
line = f.readline()
# コメントは飛ばす
if line[0:1] == "#":
continue
# EOFに到達したら終了
if not line:
break;
# 改行を削除
line = line[:-1]
# 項目に分解
terms = parseLine(line)
# リストのサイズ
size = len(terms)
# リストからインデックス、項目を順次取得
for i, t in enumerate(terms):
# 改行なし出力
if i == size - 1:
print("%s" % (t), end='')
else:
print("%s," % (t), end='')
print()
f.close()
ディレクトリを巡回してサイズの大きいファイルを取得する
#!/usr/local/bin/python3
# -*- coding:utf-8 -*-
from os import walk
from os.path import getsize, islink, join
"""
指定したディレクトリ下のファイルを順次求め、
サイズの大きい順にファイルを格納する
"""
def findBigFile(topdir, size):
MAX_FILE = size
filelist = []
for dirpath, dirs, files in walk(topdir):
for dir in dirs:
# シンボリックリンクなら削除
abspath = join(dirpath, dir)
if islink(abspath):
dirs.remove(dir)
# procは削除
if dir == 'proc':
dirs.remove(dir)
for file in files:
abspath = join(dirpath, file)
# リンクでないならファイルリストに保管
if not islink(abspath):
filelist.append((getsize(abspath), abspath))
# サイズが大きいものを最大10個保管
if len(filelist) > MAX_FILE:
filelist.sort(key=lambda file: file[0], reverse=True)
filelist = filelist[:MAX_FILE]
return filelist
if __name__ == '__main__':
filelist = findBigFile('/', 20)
"""
求めたファイルを出力する
"""
for size, filename in filelist:
print("file name: %s, size: %d" % (filename, size/1000))
ファイルの16進ダンプ出力
#!/usr/local/bin/python3
"""
ファイル16進ダンプ
"""
from sys import argv
from struct import unpack
import sys
write = sys.stdout.write
"""
blockバイトを16進で出力する
"""
def printBlock(block):
# HEXAでデータ表示
for b in block:
write( "%02x " % b)
# データがブロックサイズ以下なら空白を表示
for i in range(BLOCK_NUM - len(block)):
write( " " )
# ASCIIで表示
for b in block:
if 32 <= b <= 126 :
byte = chr(b)
else:
byte = '.'
write( "%s" % byte)
# 定数
BLOCK_NUM = 16
# ファイル名
fname = argv[1]
f = open(fname, 'rb')
write("\n")
addr = 0
while True:
block = f.read(BLOCK_NUM)
if len(block) == 0:
break
# アドレス出力
write( "%07d " % addr)
# データ出力
printBlock(block)
write("\n")
addr += BLOCK_NUM
ファイル書き込み
f = open("aaa.txt", "w")
print("aaa", file=f)
print("bbb", file=f)
print("ccc", file=f)
f.close()
