2011年1月29日土曜日

python:クラスを作ってみた

クラスの練習として、ファイルについてのクラスをつくってみました。

#
# -*- coding:sjis -*-
#
import os,sys,win32com.client
oFSO=win32com.client.Dispatch("Scripting.FileSystemObject")

class File:
 def __init__(self, path):
  self.set_path(path) #フルパス
  self.set_fdr() #フォルダ名
  self.set_name() #ファイル名
  self.set_root() #フルパスの拡張子よりも前部分
  self.set_ext() #拡張子(.を含む)
  self.set_drv() #ドライブ名(:を含む)
  self.set_isfile() #存在するか
  self.set_path83() #フルパス8.3形式名。存在時のみ。
  self.set_name83() #ファイル8.3形式名。存在時のみ。
  self.set_size() #ファイル容量(バイト)
 def set_path(self, s): self.path = s
 def set_fdr(self): self.fdr = os.path.dirname(self.path)
 def set_name(self): self.name = os.path.basename(self.path)
 def set_root(self): self.root = os.path.splitext(self.path)[0]
 def set_ext(self): self.ext = os.path.splitext(self.path)[1]
 def set_drv(self): self.drv = os.path.splitdrive(self.path)[0]
 def set_isfile(self): self.isfile = os.path.isfile(self.path)
 def set_path83(self):
  self.path83=""
  if self.isfile:

    self.path83 = oFSO.GetFile(self.path).ShortPath
 def set_name83(self):

 self.name83 = os.path.basename(self.path83)
 def set_size(self):
  self.size=0
  if self.isfile:

    self.size = os.path.getsize(self.path)
 
if __name__=="__main__":
 sIn=""
 if len(sys.argv)>1: sIn = sys.argv[1]
 p = File(sIn)
 print "path = "+p.path
 print "fdr = "+p.fdr
 print "name = "+p.name
 print "root = "+p.root
 print "ext = "+p.ext
 print "drv = "+p.drv
 print "isfile = "+str(p.isfile) #bool型
 print "path83 = "+p.path83
 print "name83 = "+p.name83
 print "size = "+str(p.size) #int型

-----
例1:存在するファイルを指定した場合
path = C:\Documents and Settings\a23456789.html
fdr = C:\Documents and Settings
name = a23456789.html
root = C:\Documents and Settings\a23456789
ext = .html
drv = C:
isfile = True
path83 = C:\DOCUME~1\A23456~1.HTM
name83 = A23456~1.HTM
size = 112


例2:存在しないファイルを指定した場合
path = C:\Documents and Settings\b23456789.html
fdr = C:\Documents and Settings
name = b23456789.html
root = C:\Documents and Settings\b23456789
ext = .html
drv = C:
isfile = False
path83 =
name83 =
size = 0

2011年1月22日土曜日

python:辞書オブジェクト

d={} #辞書dのクリア
d={key:val, ...}  #キーと値をコロンでつなぐ。要素区切りはカンマ。
len(d)  #辞書の件数
d=dict(L) #リスト→辞書(リストはキーと値の2要素リストであること)
  例)d=dict([[1,"a"], [2,"b"]]) → {1:"a", 2:"b"}
d[key]=val  #値設定
a=d[key]    #値取得(キーが無いときはエラー)
a=d.get(key, "無い時の値")  #値取得(キーが無いときは指定値返却)
if a in d:  #キーの有無判定
for (key, val) in d.items(): #キーと値の組み合わせのループ
for key in sorted(d.keys()): #キーのループ(並び替えて)
for val in d.values():  #値のループ
kvSum=dict([[k,v] for k, v in zip(KeysL, ValsL)])

 →{k1:v1, ...} #キーリストと値リストの組み合わせ辞書作成
d[key]=d.get(key,0)+cnt #キー別に値を累積
b=d.copy() #辞書のコピー 

2011年1月16日日曜日

町字の表記 順番に割り当てられた地名

・丁目(ちょうめ)
例)名護市役所
沖縄県名護市 港 一丁目 1番1号
これは全国に多数存在する表記方法。

・丁(ちょう) ※丁目に相当
例)堺市北区役所
堺市北区 新金岡町 5丁 1-4
「5丁目」ではなく「5丁」で正しい。市内に多数あり。

・町目(ちょうめ)
例)京都大宮丸太町郵便局
京都府京都市上京区 丸太町通大宮東入 一町目 857
一町目、二町目、・・・などあり。

・条(じょう)
例)北海道札幌市手稲区役所
札幌市手稲区 前田1条 11丁目 1-10

例)北海道旭川市役所
北海道旭川市 6条通 9丁目

・番町(ばんちょう)
例)名張百合が丘郵便局
三重県名張市 百合が丘東1番町 15
他にもつつじが丘、桔梗が丘、梅が丘などで1番町、2番町、・・・などあり。

・地割(ちわり)
例)八幡平(はちまんたい)市役所
岩手県八幡平市 大更 第35地割 62番地

・いろは
例)七尾市役所
石川県七尾市 袖ヶ江町 イ部 25

例)羽咋郵便局
石川県羽咋市 川原町 メ 136-4
「メ」は、いろはにほへと・・・あさきゆめみし・・の「め」。

例)八街(やちまた)市役所
千葉県八街市 八街ほ 35-29

例)匝瑳(そうさ)市役所
千葉県匝瑳市 八日市場ハ 793番地2

・十干 (甲乙丙丁戊己庚辛壬癸)
読みは、こう、おつ、へい、てい、ぼ、き、こう、しん、じん、き。
または、陰陽五行思想(wikipedia)に基づいて、
きのえ、きのと、ひのえ、ひのと、つちのえ、つちのと、かのえ、かのと、みずのえ、みずのと。

例)魚沼中条郵便局
新潟県十日町市 中条 甲 872-6
なかじょう こう。
郵便番号簿によると、中条庚は「なかじょう かのえ」。

例)香川県土庄町役場
香川県小豆郡土庄町 甲 559-2

・十二支 (子丑寅卯辰巳午未申酉戌亥)
例)十日町高田郵便局
 新潟県十日町市 子 377-7
十日町市には十二支すべてが揃っている。

十干十二支は地番の一部として扱う地域もある。

2011年1月10日月曜日

町字の表記 接尾語

町字名の末尾に付く共通する文字を思いつくまま書いてみます。

・町(まち、ちょう)
例)富山県富山市役所
富山市 新桜町 7-38
これは全国に多数存在する表記方法。

・丁(ちょう)
例)和歌山中央郵便局
和歌山県和歌山市 一番丁 4
数字地名だけでなく、鷺ノ森堂前丁 など市内に多数あり。

・通(とおり)
例)尼崎郵便局
兵庫県尼崎市 昭和通 2丁目 11-1

・免(めん)
例)松浦市役所
長崎県松浦市 志佐町里免 365
他にも今福町坂野免、鷹島町中通免など多数。

・触(ふれ)
例)壱岐市役所
長崎県壱岐市 郷ノ浦町本村触 562
他にも芦辺町箱崎中山触、石田町池田西触、勝本町大久保触など多数。

・郷(ごう)
例)西海市役所
長崎県西海市 大瀬戸町瀬戸樫浦郷 2222
他にも西海町天久保郷、崎戸町蠣浦郷など多数。

2011年1月4日火曜日

町字の表記(3)

2.町字が2段階 の続き)

2-3.旧市区町村+旧大字
例)三瀬郵便局
佐賀県佐賀市 三瀬村 三瀬 2634-1


3.町字が3段階
3-1.区+大字+丁目
岩手県奥州市役所
岩手県奥州市 水沢区 大手町 1丁目 1
「水沢区」は合併特例法に基づく地域自治区の名称。
「水沢区大手町」が大字名。

3-2.旧市区町村+大字+丁目
徳島県鳴門市役所
徳島県鳴門市 撫養町 南浜 字東浜 170
「撫養町」は市区町村合併前の旧町名(元は市区町村レベルの名称)。
「南浜」は市区町村合併前の旧大字名。
現在は、「撫養町南浜」が大字名。

(番外).通り名1+通り名2+方向+大字
京都市中京区役所
京都市中京区 西堀川通 御池 下る 西三坊堀川町 521
「西堀川通り」と「御池通り」の交差点から南へ行ったところにある「西三坊堀川町」である。京都市内は別項を立てたい。


ここまででわかるとおり、町字名の区切りレベルは地域ごとにさまざまである。
鳴門市役所の例では、町字の第1レベルが合併前は「南浜」で合併後は「撫養町」という旧市区町村レベルとなるが、暗黙で同一レベル扱いしがちである。
地域ごとの統計情報を比較する際には注意が必要である。
同一地域でも合併前後の経年変化がわからなくなることがある。

2011年1月3日月曜日

python:定数、エスケープシーケンス

pythonの規定の定数、エスケープシーケンス。

以下、「\」は半角¥マーク。

\\ 「\」文字そのもの
\' シングルクオーテーション
\" ダブルクオーテーション
\a ベル
\b バックスペース
\f 改ページ
\r キャリッジリターン
\n 改行
\t 水平タブ
\v 垂直タブ
\N{name} Unicode データベース中で名前 name を持つ文字
\uxxxx 16ビットの16進数値xxxxを持つUnicode文字
\Uxxxxxxxx 32ビットの16進数値xxxxxxxxを持つUnicode文字
\ooo 8進数oooを持つASCII文字
\xhh 16進数hhを持つASCII文字
\0 NULL
\+(改行) 文字列を途中で改行する


パス名の要素の区切り文字
os.sep    #windowsでは 半角¥

ファイル名と拡張子を分ける文字
os.extsep    #windowsでは半角ピリオド

行末文字
os.linesep    #windowsでは「\r\n」。キャリッジリターンとラインフィード

円周率
import math  # mathモジュール
math.pi    #3.1415926535897931

注意点は、mathモジュールをimportしてから使うこと。以下同様。

自然対数の底
math.e    #2.7182818284590451

整数の最大値  マシン環境によって異なる。
sys.maxint    #私の環境では2147483647

整数の最小値  マシン環境によって異なる。
-sys.maxint - 1    #私の環境では-2147483648

2011年1月2日日曜日

python:リストの内包表記

[x for x in L]
 forからリストLまでがひと区切り。forでLから取り出されたxが、forの前に渡される。


例)0~3までの各3倍の値のリスト
[0, 3, 6, 9] = [x*3 for x in range(4)]

[x for x in L if x < 10]
 for部で取り出された要素のうち、その後ろif部で評価され真だったものだけが、forの前に渡される。


[x for L2 in L1 for x in L2]
 1つ目のforでL1から取り出されたL2が、2つ目のforに渡され、 そこから取り出されたxが、1つ目のforの前に渡される。


[[x[1], x[0]] for x in L]
 要素2つのListの前後を入れ替える