こんにちは!
PYTHONでプログラム作成は順調に進んでいますか?
今回は、使いまわしファイルのコピー&リネイム作業するプログラムを作成します。
プログラムの目的
日報のように、毎日作成するファイルは、前のファイルを、コピーし、ファイル名を変えて(リネイムして)中身を編集されていると思います。
例:20210227作業日誌.odsをコピーして、20210228作業日誌.odsと、ファイル名をその日の名前に変更して中身を編集する。
これは大した作業ではありませんが、同じパターンの作業であれば、PYTHONでファイルをコピーしリネイムをさせた方が楽ではないでしょうか。
ということで、今回はこの作業をプログラム化します。
プログラムの内容
フォルダに工場A、工場B作業日誌ファイル(ods形式)とメモファイル(txt)が保存されています。その中で工場Aの作業日誌のファイルの更新日が最新のものをコピーして、当日(今日)のファイル名に変更します。
- フォルダ名:C:\Labo\作業日誌
- 作業日誌名フォーマット:工場A作業日誌[日時8桁].ods⇒工場A作業日誌20210227.ods
odsはLibreOfficeの表計算ソフトCalcのファイルになります。 - フォルダ内はodsファイル以外もある。⇒ファイル名から拡張子を確認
- 工場A以外の日誌もある⇒文字のパターン(工場A作業日誌の文字列を抽出)を見る
- 最新のファイルの検索は、ファイル名からではなく、ファイルのプロパティから判断します。今回の注目ポイントです。
- コピー&リネイムが完了すれば、ファイル名と共にメッセージを出力する。
- 当日の名前のファイルがあれば、コピー&リネイム作業をしない。そしてファイルがあることを伝えるメッセージを出力する。
プログラムコード
import os
import datetime
import shutil
folder = 'C:/Labo/作業日誌/'
factoryAname = "工場A作業日誌"
list1 = os.listdir(folder)
#odsのみ抽出
list_ods = [s for s in list1 if ((".ods") in s)]
#工場A作業日誌のファイルの空リスト作成する
list_factoryA = []
for i in range(len(list_ods)):
if list_ods[i][:-12] == factoryAname:
#工場A作業日誌をリストに追加する。
list_factoryA.append(list_ods[i])
#ファイル名にフォルダ名を加える。更新日時を調べる為
files_ods = [os.path.join(folder, f) for f in list_factoryA]
#リスト内のファイルを古い物から並べる
files_ods.sort(key=os.path.getmtime)
#日時のフォーマットを作成する
today = datetime.date.today()
newfilenamedate = '{0:%Y%m%d}'.format(today)
#最新のファイルはリストの最後、file_aに格納する
file_a = files_ods[len(files_ods)-1]
#最新のファイルの日時をファイル名から抽出する
checkdate = file_a[len(folder)+7:-4]
if checkdate == newfilenamedate:
#本日の作業日誌がすでに存在している
print("本日ファイルが作成されています")
else :
#本日の作業日誌を作成する
newods = folder + factoryAname + newfilenamedate+".ods"
shutil.copyfile(file_a, newods)
print(f'{newods}が作成されました')
では、プログラムについて解説していきます。
1~3行目:ライブラリ
今回は下記の3つのライブラリを使用します。最新のファイルを調べる為に、osを使用します。
- os : フォルダ内のファイルを抽出、最新のファイルを調べる為
- datetime:ファイル名に本日の日付を使用する為
- shutil:ファイルコピーをする為
5、6行目:ファイルの保存場所のフォルダの定義、「工場A作業日誌」のワードを定義
8行目:フォルダ内のファイルを「list1」にリスト化
list1 = os.listdir(folder)
os.listdir(”フォルダ名”)でフォルダ内のファイルをリスト化します。
11行目:「odsファイル」のみを抽出
list_ods = [s for s in list1 if ((".ods") in s)]
フォルダ内のファイルで、”odsファイル”のみを抽出します。
Forループに条件文を合わせた式になります。「list1」に格納されているファイル名に「.ods」が含まれているものをリスト「list_ods」に格納します。
14行目:工場A作業日誌のファイルの空リスト作成
list_factoryA = []
工場A作業日誌のみを格納する空リストを事前に作成します。
16~19行目:工場A作業日誌の抽出
for i in range(len(list_ods)):
if list_ods[i][:-12] == factoryAname:
#工場A作業日誌をリストに追加する。
list_factoryA.append(list_ods[i])
「len」でリスト内の要素数を取り出すことが出来ます。
「list_ods」に格納されているファイル名は、「工場A作業日誌xxxxxxxx.ods」という名前になっています。
ファイルが工場A作業日誌か工場B作業日誌かを判断する為に、ファイル名の前7文字が「工場A作業日誌」であるかを確認します。
その方法として、list_ods[i][:-12]と後ろの12文字を削除しています。これは、ファイル名の文字数もチェックしているからです。
もし後ろから12文字を削除したものが「工場A作業」であった場合、元のファイル名が「工場A作業日誌xxxxxxxxxxxx」というファイルになり、工場日誌のファイル名のパターンにマッチしない=不適合なファイルになるからです。
そして、条件にあったファイルをリスト「list_factoryA」に追加していきます。その際は、「append」を使用します。
22、24行目:ファイルを古い順から並べる
files_ods = [os.path.join(folder, f) for f in list_factoryA]
files_ods.sort(key=os.path.getmtime)
ファイル名にフォルダ名を追記した、フルパスのファイルリスト「files_ods」を作成します。
次に、「files_ods.sor(key=os.path.gettime)」で古いものから順番に並び替えています。この関数を使用するには、フルパスのファイルリストが必要になるので、先のようにファイル名にフォルダ名を追記してフルパスのファイル名としてリストを作成しています。
27、28行目:ファイル名の日付部分
today = datetime.date.today()
newfilenamedate = '{0:%Y%m%d}'.format(today)
当日の日誌のファイル名につける日付の部分です。
「‘{0:%Y%m%d}’.format」とすることで、日付のゼロ埋めをすることが出来ます。
例:202131の場合、20210301という風にゼロが挿入されます。
31、33行目:フォルダ内の最新のファイルを確認
file_a = files_ods[len(files_ods)-1]
checkdate = file_a[len(folder)+7:-4]
ファイルの更新日順で並べたリストの最後に、一番新しいファイルが格納されています。
そして、ファイル名は「工場A作業日誌”日付”.ods」という風に付けられるので、日付の部分を抜き出して、「checkdate」に格納します。
35~42行目:ファイルの作成
if checkdate == newfilenamedate:
まず最初に、フォルダ内に当日のファイルが存在していないかを確認します。
newods = folder + factoryAname + newfilenamedate+".ods"
shutil.copyfile(file_a, newods)
ファイルが存在していなければ、フォルダ内の最新のファイルをコピーし、当日の日付を加えた新しいファイル名にします。
これでプログラムの完了です。
まとめ
いかがだったでしょうか。
簡単そうに見える内容でもボリュームがありましたね。
フォルダ内のファイルの更新日でソートする方法や、日付のゼロ埋めの方法などを理解していただけたと思います。
是非、他のプログラムに応用してみて下さいね。
「役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!
コメント