僕の世界観を変えてみる

文系男子が趣味でプログラミングを勉強していくブログです。他にも日常で起きたどうでもいいことや愚痴を書いていきたいです。座右の銘は和を以て貴しとなすです。仲良くやろうよ。

【python】pythonを使ってファイル名を連番に変更する

f:id:htmllifehack:20191130120846j:plain

お久しぶりです。

バセドウ病になって倒れていたので更新頻度が激下がりになりました。

今回は本当に簡単で短い記事になってしまいますがきっと使う日がくる、そんなお話です。

画像を自動でダウンロードできるようになったらその画像を管理していくことになります。

TwitterでBotを作るときも画像のファイル名がとんでもなく長かったら登録するのも面倒くさいんです。

なので連番振って簡単にしてみました。

過去の僕への記事のようなものです。

やりたいこと

例えばこんな感じに画像が保存されていたとします。

c:\users\owner\pictures\rename_test\S29179908.jpg c:\users\owner\pictures\rename_test\S29179908_1.jpg c:\users\owner\pictures\rename_test\S__29179917.jpg

このS_2917~~が長すぎるので0001、0002のように4桁の数字の連番を振っていきたいときに使います。

globを使ってパスを取得する

おそらく一番簡単なのがglobです。

import glob

file = glob.glob(r"c:\users\owner\pictures\rename_test\*.jpg")
for i in file:
    print(i)

out:
c:\users\owner\pictures\rename_test\S__29179908.jpg
c:\users\owner\pictures\rename_test\S__29179908_1.jpg
c:\users\owner\pictures\rename_test\S__29179917.jpg

globをインポートし、globで指定したフォルダ内のファイルをすべて取得します。

subprocessという関数もありますがこれだとファイル名しか取得できないのでglobを使用します。

pathもないとファイル名の変更ができないためです。

os関数を使ってファイル名を変更する

まずはos関数を使って先ほど取得したパスをパスと拡張子に分割します。

import os

for i in file:
    name, ext = os.path.splitext(i)
    print(name)
    print(ext)

out:
c:\users\owner\pictures\rename_test\S__29179908
.jpg
c:\users\owner\pictures\rename_test\S__29179908_1
.jpg
c:\users\owner\pictures\rename_test\S__29179917
.jpg

os.pathとsplitextを使うと2つの変数に分けて挿入できます。

するとこんな感じで分割ができます。

次はc:\users\owner\pictures\rename_test\とS_29179908に分けたいと思います。

for i in file:
    name, ext = os.path.splitext(i)
    title = name.rsplit('\\',1)
    print(title)

out:
['c:\\users\\owner\\pictures\\rename_test', 'S__29179908']
['c:\\users\\owner\\pictures\\rename_test', 'S__29179908_1']
['c:\\users\\owner\\pictures\\rename_test', 'S__29179917']

splitは左から右へ流れるように文を分ける関数ですが、rsplitはその逆順になります。

例えば、今回で言うとc:\users\owner\pictures\rename_testとS__29179908で分けたいのですがsplitを使うと

for i in file:
    name, ext = os.path.splitext(i)
    title = name.split('\\')
    print(title)

out:
['c:', 'users', 'owner', 'pictures', 'rename_test', 'S__29179908']
['c:', 'users', 'owner', 'pictures', 'rename_test', 'S__29179908_1']
['c:', 'users', 'owner', 'pictures', 'rename_test', 'S__29179917']

こうなります。

split('\')[0:5] としても 'c:', 'users', 'owner', 'pictures', 'rename_test' となってしまいます。

split('\',5) だと c:', 'users', 'owner', 'pictures', 'rename_test', 'S__29179908' こうなります。

とういうことでsplitだと欲しい状態で取得できないのです。

join使えば行けますがもっと簡単にできるのがrsplitです。

物は試しでrplitを使ってみてください。

ファイル名を連番に変更する

最後にos.renameで連番に変更していきます。

for e,i in enumerate(file):
    name, ext = os.path.splitext(i)
    title = name.rsplit('\\',1)[0]
    os.rename(i,title + '\\{0:04d}'.format(e) + ext)

print([i for i in file])

out:
'c:\\users\\owner\\pictures\\rename_test\\S__29179908.jpg'
'c:\\users\\owner\\pictures\\rename_test\\S__29179908_1.jpg'
'c:\\users\\owner\\pictures\\rename_test\\S__29179917.jpg'

enumerateは何回forを繰り返したか数えてくれる関数です。

変数eに回数が入り、iにはファイル名が入ります。

enumerateの場合はzipを使わなくて済むので楽です。

いやenumerateって打つほうが面倒くさいか?

あとはformatを使って0埋めするだけです。

0:04dは4桁に合わせて0埋めするって意味です。

あえて言うなって感じはしますけど一応。

以上で完成です。

f:id:htmllifehack:20191130124629p:plain
before
f:id:htmllifehack:20191130124703p:plain
after

まとめ

本当に短い記事になってしまいました。

最近更新頻度が下がっているのでこんな内容でアクセス数が上がるのか心配です。

一応Adsence載せているのであとで収益とかのお話もできたらなって思っています。

正直4年やってるブログとは思えない少額報酬なんです。

はあ、病気にもなったことだしブログで稼ぎたいなあ