from adglobal import N, P, A, T, M, j
import adglobal as g
import os
import adsub
class person: # personクラス
def __init__(self, q): # コンストラクタ
self.p = q
def show(self, k): # class personの表示メソッド
s = self.p
str1 = "{0}: 氏名:{1} 住所:〒{2} {3} 電話:{4} mail:{5}".format(k, s[0], s[1], s[2], s[3], s[4])
print(str1)
def csvline(self): # class perosnのファイル書き込み用メソッド
s = self.p
str1 = "%s,%s,%s,%s,%s\n" % (s[0], s[1], s[2], s[3], s[4])
return str1 # 文字列str1を返す。
def fetch(self): # class personの要素を編集しやすい辞書式にするメソッド
s = self.p
d = {N: s[0], P: s[1], A: s[2], T: s[3], M: s[4]}
return d
def fix(self, d): # 辞書式になっているデータをperson classに格納して戻す
s = self.p
for i, a in enumerate(j):
if len(d[a]) > 0: # 長さが0になっている項目は格納しない
s[i] = d[a]
return s
def check(self): # データの有効性をチェックする
s = self.p
for i, e in enumerate(j):
data = adsub.zhconv(s[i]) # 郵便番号、電話番号も全角で入力されてしまうので、半角に変換する。
if not adsub.check_func[i](data): # 有効性を確認鶴関数は関数のリストに入っている。
return False
return True
class book: # 住所録クラス
def __init__(self, book_name): # コンストラクタ
self.name = book_name # 住所録の名前
self.book_path = g.ad_path + "\\" + book_name + ".csv" # 住所録名からパス名を作る。
self.a = [] # personクラスのインスタンスを格納するリスト。最初は空
def writeab(self): # 住所録をファイルに書き込むメソッド
fd1 = open(self.book_path, mode='w')
for d in self.a:
fd1.write(d.csvline())
fd1.close()
def readab(self): # 住所録ファイルを読み込むメソッド
rcnt = 0 # rcnt:レコード数
self.a = [] # 住所録データをクリアする。
if os.path.exists(self.book_path): # 住所録パスが存在するか?
fd1 = open(self.book_path, mode='r') # 住所録ファイルをopenしてファイル・オブジェクトを作る。
for str1 in fd1:
a1 = list(str1) # 一旦、ファイルから読み込んだ文字列
str1 = "".join(a1[:-1]) # str1の末尾の\nを削除する。
ncomma = str1.count(',')
if ncomma == 4: # 5項目あるので、文字列の中に','は4個のはず。
a = str1.split(',') # ','で文字列を5個の項目に分離する。
d = person(a) # 5個の文字列からpersonクラスのインスタンスを作る。
self.a.append(d) # personインスタンスをリストに付加(壊れたデータでも一応読み込む)
rcnt += 1 # レコード数を+1
if not d.check(): # 不適切なデータはエラーを出す。
print("%d'th record is illegal" % rcnt)
else: # ','が4個でないレコードはファイルが壊れているので、そこで読み込み中止。
print("{0} is broken".format(self.name))
rcnt = -1 # このとき、プログラムは強制終了してしまう。
break
fd1.close() # フィアルを閉じる
else:
rcnt = 0
if rcnt == 0:
self.a = [] # レコード数が0のときは、データなしとして、プログラムを始める。
return rcnt # レコード数を返す。-1を返すときは、読み込み失敗。
def show(self, ra): # リストra[]に入っている番号のデータを表示する。
da = self.a # da:データのリスト
size = len(da)
if size > 0: # n:項目数の確認
n = len(da[0].p)
else:
n = 5 # デフォルトの項目数は5
if size < 11: # wdt:項目番号の表示幅
wdt = 1
elif size < 101:
wdt = 2
elif size < 1001:
wdt = 3
elif size < 10001:
wdt = 4
elif size < 100001:
wdt = 5
elif size < 1000001:
wdt = 6
else: # こんなことはない
wdt = 7
w = [wdt, len(N), len(P), len(A), len(T), len(M)] # 各項目幅の初期値
if not ra: # raが空のときは住所録全体を表示する。
ra = list(range(size)) # book全体の項目番号が入る。
for i in ra: # raに入っているものの中から最大幅を求める。
q = da[i] # 住所録内の各個人データ
for k in range(n): # 各項目について調べる。
w1 = adsub.len2(q.p[k]) # len2は全角半角を考慮した長さ
if w1 > w[k+1]: # nameの幅がw[1]なので注意
w[k+1] = w1 # 表示されるものの中での最大幅を求める。
align = ["r", "l", "l", "l", "l", "l"] # 左寄せか右寄せか
d = [" ", N, P, A, T, M] # 項目名行
print(adsub.makestr(len(w), align, w, d, ' '))
# Python標準機能ではうまく行かない。書式文字列f1も無意味。
# print(f1.format(i, pa[0], pa[1], pa[2], pa[3], pa[4])) # データの表示
for k in ra:
pa = da[k].p
d = [str(k), pa[0], pa[1], pa[2], pa[3], pa[4]]
# Python標準機能ではうまく行かない
# print(f1.format(k, pa[0], pa[1], pa[2], pa[3], pa[4])) # データの表示
print(adsub.makestr(len(w), align, w, d, ' '))