DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

ファイル操作用のファイルマネージャーを作った

ファイルの保存と読み出し関数を毎回作るのは面倒なので自分用ファイルマネージャーを作った。

僕が作った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()

 

<理想のファイルマネージャー>

f:id:DreamerDream:20191230131755p:plain

 

 

<現実> 

== 本体 == 見苦しいコードなのはご勘弁。

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

kampa.me