0
2

More than 1 year has passed since last update.

PythonでExcel操作:フォルダ内の日付付き特定ファイルの取得と更新

Posted at

活用シーン

  • Excelファイルを何度も修正していく必要があるケース(Ver.00~20など)。
  • 修正前後で内容が大きく変わり、修正前のVerに戻る可能性があるため、ある一定期間、修正前後のファイルを保存しておく必要があるケース。
  • 格納しているフォルダ内には特定ファイル以外の色んなファイルが保存されているケース

方針

  • 日付で指定すると、他の日付付きファイルのコンタミするので、あくまでも「特定ファイル」のファイル名をキーとして、まず「特定ファイル_日付」だけ抽出したリストを作成し、そこからソートし、新しい日付のファイルだけを取ってくる。 日付関数などを無理に使う必要もなく抽出できます。

開発環境

 Jupyter lab
 Python3.9.6
 Windows

実施内容

以下イメージ写真の通り、Book1という特定の日付ファイルがフォルダに入っており、
この中から、一番新しい"Book1_2021-11-13.xlsx"のファイルを取得して、
編集作業を行った後、更新した日付(本日):"Book1_2021-11-14.xlsx"で保存するということを実施した。
補足:コードでは更新後、一番古いファイルを削除する例も入っている。

image.png

特定日付付きファイルの取得と更新
#必要ライブラリのインポート
from pathlib import Path
import os.path
dir_path=Path("~~~Excelファイルが格納されているフォルダを指定してください~~~")
#ファイルリストの作成
files=list(dir_path.glob("*.xlsx"))
#フォルダに格納されているExcelファイルの名前をリスト化
list_date=[]
for i in range(len(files)):
        file_name, ext = os.path.splitext(files[i].name)
        #タイトルに"Book1"がない場合はリストに入れない
        if "Book1" not in file_name:
            continue
        list_date.append(file_name)
#print(list_date)
#日付順の新しいソートし、要素0番目に指定
list_date_new=sorted(list_date,reverse=True)[0]

#新しい日付ファイルの読込み
os.chdir("~~~Excelファイルが格納されているフォルダを指定してください~~~")
import openpyxl as px
wb = px.load_workbook(f"{list_date_new}.xlsx")
#シートの指定
ws = wb["Sheet1"]

#----編集作業を実施----省略----#

#そのまま上書き保存
#wb.close()
#wb.save(f"{list_date_new}.xlsx")

#最新の日付に更新して保存
import datetime as dt
#更新した日の日付を取って保存
#例) 2021-11-14
dt_now = dt.date.today()
wb.save("Book1_"+f"{str(dt_now)}.xlsx")

#更新後に一番古いファイルを削除する。#Falseにしただけ
import os
list_date_old=sorted(list_date,reverse=False)[0]
os.remove(f"{list_date_old}.xlsx")

解説

  • フォルダ内のExcelファイル名をos.path.splitextで取得してリスト化する
  • リストをsorted()でreverse=True/Falseで指定すると新しい順/古い順に並ぶ
  • 先頭のリストを指定すれば所望(新しい日付)のファイルだけ取得できる
  • 更新日付はdt.date.today()で取得した日付をファイル名に埋め込めばOK
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2