パソコンのフォルダの中って気がついたら散らかっていませんか?
そのまま放置しているとどこに何があるかわからなくなってしまいます。
また、何年も前に作成されたファイルで何に使っているの?っていうファイルも残ったりしていませんか?
他の方と共同で使用している共有のフォルダならなおさらです。
そこで、pythonでファイル整理をするため「一定期間アクセスのないファイルの一覧を作成」するのプログラムをご紹介します。
【ファイル整理】pythonでフォルダ内のファイル一覧を作成
まずはサンプルプログラムです。
# coding: utf-8
import glob
import os
import time
import datetime
# 整理対象のフォルダ
CheckFolder = 'c:/Users/整理対象のフォルダ名/**'#←整理対象のフォルダを指定する
# フォルダ内のフォルダとファイルの一覧を再帰的取得
DirList = glob.glob(CheckFolder, recursive=True)
# 古いファイルを検出(エポック秒と比較するため「秒」で指定)
# 2年の場合 → 2年×365日×24時間×60分×60秒
TimeLimit = 2 * 365 * 24 * 60 * 60
# 現在時刻を取得
ut = time.time()
# リスト保存ファイル名
ListFile = 'C:/Users/user/Desktop/リスト化したファイル名.csv'#←リスト化したファイルの保存場所と名前を指定する
# リスト保存用のファイルをオープン
with open(ListFile, mode='w',encoding='utf_8_sig') as f:
# ヘッダー
f.write('"作成日","更新日","アクセス日","パス"\\n')
for item in DirList:
# ファイルまたはフォルダが存在するかどうかの判定(リスト作成後に削除される可能性もあるので)
if os.path.exists(item):
# ファイルかフォルダの判定(ファイルのみを対象にする場合)
if os.path.isfile(item):
# ファイルの作成日・更新日・最終アクセス日を取得(エポック秒)
cTimeStamp = os.path.getctime(item)#作成日
mTimeStamp = os.path.getmtime(item)#更新日
aTimeStamp = os.path.getatime(item)#最終アクセス日
# エポック秒を通常の日付形式に変換
cstrDateTime = str(datetime.datetime.fromtimestamp(int(cTimeStamp)))#作成日
mstrDateTime = str(datetime.datetime.fromtimestamp(int(mTimeStamp)))#更新日
astrDateTime = str(datetime.datetime.fromtimestamp(int(aTimeStamp)))#最終アクセス日
# バックスラッシュをスラッシュに変換(私の環境ではエラーになるため)
item = item.replace('\\\\','/')
# ファイルの最終アクセス日と現在時刻の差額を取得
CheckTime = ut - aTimeStamp
if CheckTime > TimeLimit:
# ファイル情報を記録
f.write('"' + cstrDateTime + '","' + mstrDateTime + '","' + astrDateTime + '","' + item + '"\n')
このプログラムで次の作業をおこなっています。
- フォルダ内のフォルダとファイルの一覧を再帰的取得
- フォルダ内のフォルダとファイルの作成日・更新日・最終アクセス日を取得
- 最終アクセス日から一定期間を経過したファイルをリストをcsvファイルで保存
それぞれ、詳しく説明していきます。
【glob】フォルダ内のフォルダとファイルの一覧を再帰的取得
globはフォルダ内のファイル・フォルダを取得することができます。
引数のフォルダ名にはワイルドカード「*」(長さ0以上の文字を表す)も使用可能です。
import glob
FileList = glob.glob('フォルダ名/*.csv')
上記のように指定することでフォルダ内のcsvファイルのみが取得できます。
さらに、引数「recursive=True」と「**」を組合せることでフォルダ内のサブフォルダも含めたディレクトリ全体のリストを取得できます。
import glob
FileList = glob.glob('フォルダ名/**', recursive=True)
【os.path.getctime】ファイルの作成日・更新日・最終アクセス日を取得
ファイルの作成日等の情報は次の関数で取得できます。
import os
cTimeStamp = os.path.getctime('ファイル名')#作成日
mTimeStamp = os.path.getmtime('ファイル名')#更新日
aTimeStamp = os.path.getatime('ファイル名')#最終アクセス日
「get」と「time」の間「c、m、a」がそれぞれ違いますのでご注意ください。
(私は最初どこが違うのかわかりませんでした笑)
この関数で取得できるのは「エポック秒」と言われる「1970年1月1日0時0分0秒」からの秒数です。
2020年1月1日は「1577804400」と表示されますので、一見すると意味がわかりません。
そこでエポック秒を通常の日付形式に変換しているのがfromtimestamp関数です。
cTimeStamp = os.path.getctime('ファイル名')#エポック秒を取得
cTimeStamp = int(cTimeStamp)#少数を切り捨て
cstrDateTime = datetime.datetime.fromtimestamp(cTimeStamp)#日付形式に変換
cstrDateTime = str(cstrDateTime)#文字列に変換
小数点以下のミリ秒はファイルの作成日等には不要ですので小数点以下を切り捨ててから日付形式に変換。
丁寧に書くと上記のようになるのですが、これを一行で以下のように書いてます。
cstrDateTime = str(datetime.datetime.fromtimestamp(int(cTimeStamp)))#作成日
次に経過期間の確認です。
timeで現在のエポック秒を取得しファイルの作成日・更新日等との差で経過している秒数を取得可能です。
「年×日×時間×分×秒」で計算したファイルの保存期限を比べリストへの書き込みをしています。
import time
ut = time.time()# 現在のエポック秒を取得
CheckTime = ut - cTimeStamp# 現在と作成日との経過秒を取得
TimeLimit = 2 * 365 * 24 * 60 * 60# 保存期限は2年、2年×365日×24時間×60分×60秒
if CheckTime > TimeLimit:
# 経過している秒数が大きければタイムオーバー
【opne】pythonでファイル書き込み・保存
pythonでファイルの読み書きはopen関数を使用します。
with open('ファイル名', mode='w',encoding='utf_8_sig') as f:
引数「mode」で読み込み・書き込みを指定します。
- r:読み込み
- w:新規作成・上書き
- a:末尾に追加(追記)
さらに引数「encoding」でエンコードを指定します。
指定しなければパソコンのデフォルト文字コードに変換され、Windowsの場合はシフトJIS。
pythonのデフォルトが「UTF-8」なので同じ文字コードで処理した方がエラーが少ないです。
そこでエンコードは「utf_8_sig」を指定します。
これは「BOM付きUTF-8」という文字コードで、これで出力したcsvファイルはエクセルで文字化けしないので非常に便利です。
f.write('書き込み内容')
write関数で書き込みをしています。
最後に
ファイルの整理のため一定期間アクセス(使用)していないファイルの一覧表を作成するプログラムを紹介しました。
サンプルコードでは以下の作業をしています。
- フォルダ内のフォルダとファイルの一覧を取得
- フォルダとファイルの作成日・更新日・最終アクセス日を取得
- 最終アクセス日から一定期間を経過したファイル名をcsvファイルで保存
サンプルコードではリスト化しました。
しかし「一定期間アクセスのないファイル名を保存」の部分を「削除」に変えてさらに手間も省くこともできます。
また、次のように段階を踏んで削除するのもイイかもしれません。
- 一定期間アクセスのないファイルは一時保存フォルダに移動
- 一時保存フォルダに移動後さらに一定期間アクセスが無ければ削除
参考にしていただければ嬉しいです。
pythonでメール送信をするサンプルコードを紹介しています。
こちらもご覧ください。
おすすめ書籍
証券口座にログインしたあとに必要なデータの取得方法や加工の方法など、pythonでのWebスクレイピングの基本が学べます。
おすすめスクール
大学生に特化し、受講生/卒業生間のつながりを重視
マンツーマン指導のプログラミングスクールの中で業界最安水準の価格設定!!
まずは無料体験レッスンからどうぞ。
techmeetsはプロのエンジニアになることを支援するオールジャンルカバー型エンジニアスクールです。
まずは無料面談からどうぞ。
転職やキャリアアップ、フリーランスを本気で考えている方向けのプログラミングスクールです。
転職などのサポートも充実しているため、未経験からIT業界へ転職を求めている方へおすすめです!
まずは無料相談からどうぞ。
GEEK JOBは、「学びかた」を改革し、自ら学び自らサービスを創り出す人を増やすをミッションにプログラミング学習や転職・就職支援、エンジニアの育成を行なっています。
まずは説明会の参加からどうぞ。
コメント