一括でファイル名を変換する 【Python】

programming Python

ファイルをフォルダに入れておくと、日付つきのファイル名に一括変換する Python のスクリプトについてまとめておきます。

以下の環境で動作確認をしています。
環境: Windows、Python 3.X (+ Anaconda)

背景

最近は、グーグルやネット銀行/証券などのサイトで、csv ファイルなどのデータをダウンロードできるサービスが増えました。

ところがサイトによっては、ダウンロードしたときのファイル名が、常に同一の名前となっていることがあります。すなわち、ダウンロードする日時によって、明細の内容が変動しているにもかかわらず、ファイル名が同一になっていることがままあります。

ファイル名が被っていると、過去にダウンロードしたデータに上書きして消してしまうミスが発生しえます。かといって、今後、ずっと手作業でファイル名を修正していくのかとなると、これも将来の自分の時間を奪うことになるため避けたいところです。

ユーザがデータを何度もダウンロードするのは、その時点での記録、来歴を保存しておきたいからです。
そこで、ダウンロード後、ダウンロードしたファイルを日付(+時刻)つきのファイル名に一括変更する Python のスクリプトを作成しましたので公開しておきます。

なお、私の場合、ウェブサービスなどのサイトからよくダウンロードするファイルとしては、銀行やクレジットカードの明細、証券会社の明細、Google Search Console、Google Trends、レンタルサーバーなどのファイルなどがあります。
ファイルフォーマットとしては、csv、pdf、xls、txt などがあります。
種類も数十を超え、増加傾向です。

一部は自動処理をしていましたが、気づかないうちに増加しており、ファイルのダウンロードとファイルのドラッグを毎日のように繰り返していました。

そこで、スクリプトを作り直して汎用化し、バッチファイルのダブルクリックでPython を実行し、すべてを一括変換できるようにしました。

設定手順

① 以下を参考に、ファイル変換のための作業用のフォルダを作成してください。
c:\user\file_renamer1
② ①のフォルダ内に file_renamer1.py 等の名前でテキストファイルを作成し、下記のサンプルコードを貼りつけて保存してください。
③ ①のフォルダ内に “folder1” という名前でフォルダを作成してください。

使い方

④ ”folder1″ フォルダ内に、ファイル名を修正したいファイル(csv ファイルなど)を入れてください。
最初に使う場合は、テスト用のファイルを試しに入れてみて、うまく変換できるか確認をしてください。
例: test1.csv
⑤ コンソールを起動して②のスクリプトを実行してください。
ファイル名の後半部分に日付時刻を付加して、ファイル名を変換します。
例: test1_210901_123011.csv
※ ファイル名にすでに日付時刻がついていた場合は、変換をスキップします。

うまく動いたら 
・ うまく動いたら、ファイルを増やすなど活用してみてください。
・ 画像や動画のファイル名も一括変換できると思います。
・ サンプルスクリプトでは、(元のファイル名)+(年月日)+(時分秒)としています。不要部分があれば、スクリプトで該当部分を削除してください。
YYYY形式、YY形式、日付のみのファイル名、固定したファイル名にするなど、どのようにでもカスタマイズできると思います。

まとめ

ファイル名を一括変換する Python のスクリプトについてまとめました。

なお、技術的にはサイトのログインのところから selenium や pyautogui などで自動化してもよいのですが、パスワード管理など不安なところもあります。そこでまずは、ダウンロード以降の自動化についてまとめました。

とはいえ、ある金融系のサイトでファイルをダウンロードすると、ファイル名が New_file.csv、SaveFile….csv 等となっています。保存したファイルを参照しようとすると、古い New_file、何をセーブしたかがわからない SaveFile が複数見つかります。
また、あるサービスでは、別々のページからファイルをダウンロードすると、ファイル名が日付時刻のみの同一フォーマットとなっています。何を保存したのかは、ファイルを Excel などで開いて確認していかないとわからない、Webサービスの設計仕様になっています。
サイトの発注をされる方、経営陣の方、Web系エンジニアの方も含め、こういったところは、誰一人、気にならないのでしょうか。。

関連リンク
・ ファイルを一括で移動する 【Python】
・ バッチファイルで Anaconda から Python を実行する方法 【Windows 10】
・ 数値を文字列に変換するときによく使うコードまとめ 【Python】
・ ウェブ検索と結果取得を自動化する【Python & selenium】

サンプルコード

import os 
import glob as gb1 
import datetime as dt1 

path1 = os.path.dirname(__file__) + "/"  
pattern1 = path1 + "folder1/*.*"
files1 = gb1.glob( pattern1 ) 

for file1 in files1: 
    time1 = dt1.datetime.fromtimestamp( os.path.getmtime( file1 ) ) 
    ymd1 = "{0:%y%m%d_%H%M%S}".format( time1 ) 
    path2 = os.path.split( file1 )[0]                                          # path 
    file2 = os.path.split( file1 )[1]                                          # original file name   *.csv 
    file3 = file2.split( "." )[0] + "_" + ymd1 + "." + file2.split( "." )[1]   # revised file name 
#   file3 = file2.split( "_" )[0] + "_" + ymd1 + "." + file2.split( "." )[1]   # revised file name 
    file4 = path2 + "/" + file3 
    if os.path.isfile( file3 ): 
        print( "already exists!: " + file4 ) 
    elif (ymd1 + ".") in file1: 
        print( "already revised! " + file1 ) 
    else: 
        os.rename( file1, file4 )                                              # rename file 
タイトルとURLをコピーしました