ぺーぱーふぇいす

雑記と備忘録。私はプログラマ。

【Python】ファイル情報格納クラス(フルパスとか作成日時とか格納しとく入れ物)

ちょっとしたファイル処理とかする時、フルパスとかファイルサイズとか、ファイルのプロパティを総合的に扱う時にpathlibを使ったり、ファイル作成日時を調べるのにos.path.getctime()とか使い分けるのがめんどくさい。

コンストラクタにパスを渡したら、該当のファイルのそうした情報をメンバとして格納したインスタンスを作成するクラスを作った。

ソース

import os
from pathlib import Path
from datetime import datetime
import time

class FileInfo(object):
    """
    ファイル情報

    Attributes
    ----------
    file_name : str
        ファイル名。
    full_path : str
        フルパス。
    dir_name : str
        ディレクトリ名。親ディレクトリ。
    dir_path : str
        ディレクトリパス。親ディレクトリまでのフルパス。
    size : int
        容量。
    extension : str
        拡張子。
    create_time : datetime
        作成日時。
    """

    @staticmethod
    def epoch_to_datetime(epoch):
        """
        エポック秒をdatetime型に変換

        Parameters
        ----------
        epoch : float
            エポック秒。

        Return
        ----------
        result : datetime
            エポック秒からdatetime.datetime型に変換した日時。
        """
        result = datetime(*time.localtime(epoch)[:6])
        return result

    def __init__(self, path):
        """
        Parameters
        ----------
        path : str
            ファイルのみ。
        """
        p = Path(path)
        
        self.file_name = p.name
        self.full_path = str(p.resolve())
        self.dir_name = p.parent.name
        self.dir_path = str(p.parent)
        self.size = os.path.getsize(path)
        self.extension = ''.join(p.suffixes)
        self.create_time = FileInfo.epoch_to_datetime(os.path.getctime(p))
        self.update_time = FileInfo.epoch_to_datetime(os.path.getmtime(p))
        self.last_access_time = FileInfo.epoch_to_datetime(os.path.getatime(p))

使用例

例えば、/users/test/sample.tar.gzというファイルに対し、インスタンスを作成して各メンバにアクセスしてみるサンプル。

if __name__ == '__main__':

    p = Path(r"/users/test/sample.tar.gz")
    f = FileInfo(p)
    print("ファイル名: " + f.file_name)
    print("フルパス: " + f.full_path)
    print("ディレクトリ名: " + f.dir_name)
    print("ディレクトリパス: " + f.dir_path)
    print("拡張子: " + f.extension)
    print("サイズ: " + str(f.size) + " byte")
    print("作成: " + str(f.create_time))
    print("更新: " + str(f.update_time))
    print("最新: " + str(f.last_access_time))

"""
ファイル名: sample.tar.gz
フルパス: /users/test/sample.tar.gz
ディレクトリ名: test
ディレクトリパス: /users/test/
拡張子: .tar.gz
サイズ: 6868 byte
作成: 2018-08-15 18:33:57
更新: 2018-08-13 14:31:43
最新: 2018-08-15 18:33:57
"""

注意

今の所、コンストラクタに渡されるパスは実在するファイルパスであることが前提なので、存在チェックや本当にファイルパスであるか(=ディレクトリパスではないか)といった前処理が必要。