こんな人にオススメ
Macでスクショを大量に撮影したんだけど、ファイル名を変更するのが面倒!デフォルトで名前を変更することもできるけど時すでに遅し。
どうせなら
python
でかっこよく決めたいんだけどいい方法ない?ということで、今回は小技で、Macのスクリーンショットのファイル名をpythonを使用して一括変更する方法について紹介する。以前Macに入れているアプリ紹介をした際にスクリーンショットを撮りまくった。その時にファイル名変更について疑問に思ったのでここでメモ書きしておく。その記事については以下。
-
-
【M1 Mac】MacBook Proに入れている便利でニッチなアプリを21個紹介する
続きを見る
楽にファイル名変更をしたいというときに活用してほしい(一応、デフォルトのファイル名を変更することもできるが、個人的にはデフォルトは変えたくない派なので毎回変更する)。
python環境は以下。
- Python 3.9.2
pythonでファイル名変更
pythonを用いてファイル名変更をする場合は以下のステップを踏めば良い。
- ファイルをうまく絞り込めるような条件をつける
- ファイル名を変更
- ファイルを読み込む
- 変更後のファイル名になるように、ファイル名を決定する
- 作成したファイル名で元のファイル名を上書きしてファイル名を変更
今回は2種類のファイル名に変更する。
- 年月日_時分秒
- Y年M月D日h時m分s秒
元のファイル一覧は今回は以下。それぞれカタカナや空白、ハイフンそしてピリオドが入っている。
- スクリーンショット 2021-04-17 12.40.51.png
- スクリーンショット 2021-04-17 12.40.56.png
- スクリーンショット 2021-04-17 12.40.58.png
- スクリーンショット 2021-04-17 12.41.28.png
- スクリーンショット 2021-04-17 12.41.42.png
下準備
まずはファイルの読み込み。
import glob import re import os files = glob.glob("./*.png") print(*files, sep='\\n') # ./スクリーンショット 2021-04-17 12.41.42.png # ./スクリーンショット 2021-04-17 12.40.58.png # ./スクリーンショット 2021-04-17 12.40.51.png # ./スクリーンショット 2021-04-17 12.41.28.png # ./スクリーンショット 2021-04-17 12.40.56.png
これらの読み込んだファイル名を、数字か数字でないかに分けそして整理する。
# ファイル名から数字を抽出 num_none_lst = [] num_lst = [] for file in files: # 文字列を削除 num_none = re.findall(r'\\d*', file) num_none_lst.append(num_none) # 発生した空白を削除 number = list(filter(None, num_none)) num_lst.append(number) print(*num_none_lst, sep='\\n') # ['', '', '', '', '', '', '', '', '', '', '', '', '2021', '', '04', '', '17', '', '12', '', '41', '', '42', '', '', '', '', ''] # ['', '', '', '', '', '', '', '', '', '', '', '', '2021', '', '04', '', '17', '', '12', '', '40', '', '58', '', '', '', '', ''] # ['', '', '', '', '', '', '', '', '', '', '', '', '2021', '', '04', '', '17', '', '12', '', '40', '', '51', '', '', '', '', ''] # ['', '', '', '', '', '', '', '', '', '', '', '', '2021', '', '04', '', '17', '', '12', '', '41', '', '28', '', '', '', '', ''] # ['', '', '', '', '', '', '', '', '', '', '', '', '2021', '', '04', '', '17', '', '12', '', '40', '', '56', '', '', '', '', ''] print(*num_lst, sep='\\n') # ['2021', '04', '17', '12', '41', '42'] # ['2021', '04', '17', '12', '40', '58'] # ['2021', '04', '17', '12', '40', '51'] # ['2021', '04', '17', '12', '41', '28'] # ['2021', '04', '17', '12', '40', '56']
数字のみを抽出したい場合は正規表現で\\d*
と指定すれば良い。しかし、re.findall
の時点では数字でない箇所が空白文字列になっているので、それをfilter
で削除している。
これで準備が整ったので、それぞれの方法に沿ってファイル名を構築する。
年月日_時分秒
完成例としては20210417_124051.png
というようなファイル名。まずは年月日と時分秒の間にアンダースコア_
を入れる。そしてlistになっている年月日_時分秒を結合して1つの文字列に変換する。
# 年月日_時分秒 # 抽出した数字をつなげる date_lst = [] for lst in num_lst: # 日付と時間の間にアンダースコアを入れる lst.insert(3, '_') date_lst.append(''.join(lst)) print(*date_lst, sep='\\n') # 20210417_124142 # 20210417_124058 # 20210417_124051 # 20210417_124128 # 20210417_124056
完成版の文字列ができたので、os.rename
でファイル名を変更する。os.rename(before, after)
だ。
# ファイル名変更変更 for file, date in zip(files, date_lst): os.rename(file, f"{date}.png") files2 = glob.glob("./*.png") print(*files2, sep='\\n') # ./20210417_124051.png # ./20210417_124056.png # ./20210417_124142.png # ./20210417_124058.png # ./20210417_124128.png
Y年M月D日h時m分s秒
完成例としては./2021Y04M17D12h40m56s.png
というようなファイル名。今回はY
やs
などの文字列を追加しないといけないので、for
ループを2回回して数字と記号を足していく。
# Y年M月D日h時m分s秒 date_str = 'YMDhms' date_lst = [] for lst in num_lst: union = '' for num, symbol in zip(lst, date_str): union += num + symbol date_lst.append(union) # 2021Y04M17D12h41m28s # 2021Y04M17D12h40m56s # 2021Y04M17D12h41m42s # 2021Y04M17D12h40m51s # 2021Y04M17D12h40m58s
先ほど同様、ファイル名を変更する。
for file, date in zip(files, date_lst): os.rename(file, f"{date}.png") files2 = glob.glob("./*.png") print(*files2, sep='\\n') # ./2021Y04M17D12h40m56s.png # ./2021Y04M17D12h40m51s.png # ./2021Y04M17D12h41m28s.png # ./2021Y04M17D12h40m58s.png # ./2021Y04M17D12h41m42s.png
注意点
今回は2種類の方法でのファイル名変更を紹介したが、これらのコードを起動させると一瞬でファイル名が変更される。「変更しますか?」というような設定はしていないので、実際に使用する際にはコピーをとっておく、かつ、最初は少ないファイルで試すなどの対策をしておくことを推奨する。
Mac純正の機能でファイル名の一括変更
実はMacのFinderでもファイル名の一括変更が可能。ファイル名を変更したいファイルを選択し、右クリックすると以下のようなポップアップが出てくる。
この中の「名称変更...」を選択すると以下のように文字置換の指定ができる「テキストを置き換える」がある。置換以外にも「テキスト追加」と「フォーマット」がある。使い方は知らん。
今回は置換を用いて、最初の「年月日_時分秒」にファイル名を変更する。手順は以下だが、うまくいくようにすれば置換の順番は守らなくてもいい。
- 「
スクリーンショット
」を「」(何も指定しない)にする - 「
-
」を「」にする - 「
12.
」を「12
」にする。この時、.
だけだと拡張子も消される - 「
.2
」を「2
」にする - 「
.4
」を「4
」にする - 「 ``」(空白)を「
_
」にする
工程が多い。pythonを起動せず、かつ完成形のファイル名に簡単に置き換えられるのであればこのFinderを使った方法でもいいだろう。
自動化の良い一例
今回は短いがMacのスクショのファイル名を一括変更するというコードを紹介した。プログラミングを使用して自動化するということの良い一例だと思う。プログラミングで何ができるのかと聞かれた時にこういう作業を自動化できると言えるだろう。