ファイルの保存と読み出し関数を毎回作るのは面倒なので自分用ファイルマネージャーを作った。
僕が作ったpythonアプリの殆どでこれをimportして使っている。
書き直すのは面倒なのでpythonを弄り始めて間もない頃に書いたpyhton初心者の見苦しいコードだけど後で書く備忘録はコレが無いと他人への説明が難しくなるので残しておくことにする。
今見直すとreadlines()の存在を知らなかったりとお粗末なコードなのだけれど今の所問題無く動いているので今もこのまま使っている。
オリジナルアプリのログファイル出力も担っている。
ログファイルを生成はSDカードではなくメモリ上に指定。
logdir = "/dev/shm/log"
実際には/dev/shm/log/(アプリ名)/(ログ日時)
という形式で出力される。
電源OFFしたらデータは消えちゃうけど、毎日0時に昨日のログファイルをメールで送信してからファイルが一定数を超えていたら古いファイルから削除する。
という方法でSDカードに負担をかけずログを残すようにしたのでメモリが切迫することも無いだろう。
※2016-01-24追記
システムの先同時にログを消さないように、他プログラムからバックアップ指令があった場合、
logdir_tmp = "/var/tmp/log"
で指定で指定した退避場所にログのバックアップを取る事にした。
== 使いかた一覧 ==
まずインポート
import file_mng
テキストファイルを生成。ディレクトリが存在し無い場合はディレクトリ生成。
返り値:エラーが無ければTrue
file_mng.save(保存先ディレクトリ, 保存テキストデータ)
テキストファイルを既存のファイルに追加保存する。ディレクトリ、ファイルが存在しない場合は生成。
返り値:エラーが無ければTrue
file_mng.save_add(保存先ディレクトリ,保存テキストデータ)
テキストファイルの読み出し
返り値:リスト形式でのテキスト、取得失敗時には"not Load"
file_mng.load(読み出しファイル名)
テキストファイルの指定行を読み出し
返り値:改行コードを除いた指定行テキスト、失敗時に"err"出力
file_mng.load_line(読み出しファイル名, 読み出し行)
テキストファイルの行数を取得
返り値:int形式で行数、失敗時"err"出力
file_mng.load_linenum(読み出しファイル名)
ディレクトリ内のファイル名をリストで取得
返り値:リスト形式でのファイル名、失敗時"err"出力
file_mng.get_filename(ディレクトリ名)
ディレクトリ内のファイル数を取得
返り値:int形式でのファイル数、失敗時"err"出力
file_mng.get_filenum(ディレクトリ名)
ディレクトリの新規作成
返り値:エラーが無ければTrue
file_mng.make_dir(ディレクトリ名)
ファイルを削除
返り値:エラーが無ければTrue
file_mng.del_file(ファイル名)
ディレクトリを削除
返り値:エラーが無ければTrue
file_mng.del_dir(ディレクトリ名)
ファイルをコピー
返り値:エラーが無ければTrue
file_mng.copy_dir(コピー元ファイル名, コピー先ファイル名)
ファイルを移動
返り値:エラーが無ければTrue
file_mng.move(移動元ファイル名,移動先ファイル名)
ログディレクトリ内の同ファイル名(同日ログ)をフルパスで一覧取得する(指定日時のログファイルを選択して清掃する時に使用)
返り値:リスト形式でファイルのフルパス
file_mng.search_log(ログディレクトリ, ログファイル名)
ディレクトリ内のファイルをフルパスで取得する
返り値:リスト形式でファイルのフルパス
file_mng.search_files(ディレクトリ名)
日時をstr形式年/月/日 時:分:秒表記で取得
返り値:str形式で現在日時
file_mng.get_daytime()
日時をint形式で取得
返り値:int形式で14ケタの現在日時
file_mng.get_today()
一日前の日時をint形式で取得
返り値:int形式で14ケタの一日ズラした日時
file_mng.get_yesterday()
ログ出力ディレクトリを読み出す
返り値:ログ用に指定したディレクトリ名
file_mng.get_logdir():
ログを書き出す
返り値:なし
file_mng.save_log(アプリケーション名,ログ)
ログデータの退避場所を取得
戻り値:ログデータ退避場所
file_mng.get_logdir_tmp()
ログデータ退避場所にデータがあるか
戻り値:データがあればTrue
file_mng.is_tmp_logs()
ログデータ退避場所のディレクトリを削除
戻り値:無し
file_mng.del_logs_tmp()
メモリ上のアプリログデータをデータ退避場所に追記コピー
戻り値:無し
file_mng.backup_logs()
<理想のファイルマネージャー>
<現実>
== 本体 == 見苦しいコードなのはご勘弁。
2016-01-24更新(ログデータの退避処理追加)
-- file_mng.py --
#!/usr/bin/python
#coding:utf-8
import sys
import os
import shutil
import glob
import datetime
logdir = "/dev/shm/log"
logdir_tmp = "/var/tmp/log"
def save(filename, savedata):
dirname = filename.rsplit("/",1)
if os.path.isdir(dirname[0]) == False:
make_dir(dirname[0])
try:
f = open(filename ,"w")
f.write(savedata)
f.close()
return True
except:
return False
def save_add(filename, savedata):
dirname = filename.rsplit("/",1)
if os.path.isdir(dirname[0]) == False:
make_dir(dirname[0])
try:
f = open(filename ,"a+")
f.write(savedata)
f.close()
return True
except:
return False
def load(filename):
st =
try:
f = open(filename ,"r")
while True:
s = f.readline()
if s == "":
break
st.append(s.rstrip())
f.close()
except:
return "not Load"
return st
def load_line(filename, lineno):
st = ""
linecount = 0
try:
f = open(filename ,"r")
while True:
linecount += 1
line = f.readline()
if line == "":
break
if lineno == linecount:
st = line
break
f.close
except:
print "not Load"
return st.rstrip()
def load_linenum(filename):
linecount = 0
try:
f = open(filename ,"r")
while True:
line = f.readline()
if line == "":
break
linecount += 1
except:
print "err"
return linecount
def get_filename(dirname):
fs =
try:
files = os.listdir(dirname)
for file in files:
fs.append(file)
except:
print "err"
return fs
def get_filenum(dirname):
try:
files = os.listdir(dirname)
return len(files)
except:
print "err"
def make_dir(dirname):
try:
os.makedirs(dirname)
return True
except:
return False
def del_file(filename):
try:
os.remove(filename)
return True
except:
return False
def del_dir(dirname):
try:
shutil.rmtree(dirname)
return True
except:
return False
def copy_dir(dirname, cpname):
try:
shutil.copytree(dirname, cpname)
return True
except:
return False
def move(filename, mvname):
try:
shutil.move(filename, mvname)
return True
except:
return False
def search_log(logdir, filename = ""):
return glob.glob(logdir + "/*/" + filename)
def search_files(dir):
return glob.glob(dir)
def get_daytime():
now = datetime.datetime.now()
return now.strftime("%Y/%m/%d %H:%M:%S")
def get_today():
return datetime.date.today()
def get_yesterday():
today = get_today()
one_day = datetime.timedelta(days=1)
yesterday = today - one_day
return yesterday
def get_logdir():
return logdir
def save_log(appname,log):
save_add(get_logdir() + "/" + appname + "/" + str(get_today()), get_daytime() + " " + log + "\n")
def get_logdir_tmp():
return logdir_tmp
def is_tmp_logs():
if 0 < get_filenum(get_logdir_tmp()):
return True
else:
return False
def del_logs_tmp():
del_dir(get_logdir_tmp())
def backup_logs():
logfiles = search_log(get_logdir(), str(get_today()))
for st in logfiles:
sp = st.rsplit("/",2)
apl = sp[1]
day = sp[2]
file = load(st)
body = ""
for s in file:
body += s + "\n"
save_add(get_logdir_tmp() +'/' + apl + '/' + day ,body)
if __name__=='__main__':
pass