犬猫の分類やるんだけど、音声データ(wavファイル)とスペクトログラム(画像)を分類に合わせて、ディレクトリに格納したい。
ということでディレクトリの作成や分類結果の記録、そして分類結果に基づいてファイルの移動を自由にやりたいので、ちょっと調べてみました。
そして、一応できそうなので記事にしておこうと思います。
【参考】
・①Pythonでファイル・ディレクトリを移動するshutil.move@note.nkmk.me
・②Pythonでのファイル操作
・③shutil --- 高水準のファイル操作
ということで、以下のようなプログラムでやりたいことはできそうです。
コードの説明
今回は、カラスの鳴き声を3つのグループに分けて分類しています。
※本論は別途書きます
そこで、以下のように3つのディレクトリを作成してここに分類後にそれぞれ格納しようと考えています。
最初に、分類前のwavとスペクトログラムが23個ずつ一つのディレクトリに格納してある前提です。
まず、一応ディレクトリ作成から入ります。
※存在していれば何も起こりません(ディレクトリが予め存在していてもエラーにはなりません)
import shutil
import os
os.makedirs('./dog-cat/3karasu/wav/angry', exist_ok=True)
os.makedirs('./dog-cat/3karasu/wav/normal', exist_ok=True)
os.makedirs('./dog-cat/3karasu/wav/others', exist_ok=True)
s=0はデータの通し番号です。
※ここではiも通し番号なので同じ表記にしてもいいかもしれませんが、一応分けています
このプログラムでは偶数と3の倍数とそれ以外で分けています。
s=0
for i in range(23):
if i%2==0:
path = 'angry'
elif i%3==0:
path = 'normal'
else:
path = 'others'
以下テキストファイルに分類結果を記載するようにしました。
※ここではappendしています
ちなみに、参考①の書き方でも以下の書き方で同じ結果が得られます。
※こちらだとwith処理終了で自動的にcloseできるんですね(参考②のコメントより)
with open('./dog-cat/3karasu/wav/file.txt', 'a') as f:
f.write(path+'\n')
#with open('./dog-cat/3karasu/wav/file.txt', 'w') as f:
# f.write(path)
f = open('./dog-cat/3karasu/wav/file.txt','a')
f.write(path + '\n')
f.close()
そして、今回のメインディッシュは以下のshutil.moveでファイルの移動ができます。
※参考①では、ディレクトリ移動なども紹介されています。参考③に全機能説明があります
ちなみにプリント文は確認のために入れています
new_path = shutil.move('./dog-cat/3karasu/wav/' + str(s)+'.wav', './dog-cat/3karasu/wav/'+ path)
print(os.listdir('./dog-cat/3karasu/wav'))
print(os.listdir('./dog-cat/3karasu/wav/angry'))
new_path = shutil.move('./dog-cat/3karasu/wav/' + str(s)+'.wav', './dog-cat/3karasu/wav/'+ path)
new_path = shutil.move('./dog-cat/3karasu/wav/figure' + str(s)+ '.jpg', './dog-cat/3karasu/wav/' + path)
print(new_path)
print(os.listdir('./dog-cat/3karasu/wav'))
print(os.listdir('./dog-cat/3karasu/wav/angry'))
s += 1
ログっぽくするために
上記のログ記録の前に今の時刻取得してログに記載することにしました。
【参考】
・Pythonのdatetimeで日付や時間と文字列を変換(strftime, strptime)@note.nkmk.me
import datetime
dt_now = datetime.datetime.now()
with open('./dog-cat/3karasu/wav/file.txt', 'a') as f: #w
f.write(str(dt_now)+'_'+str(s)+': '+path+'\n')
file.txtの出力例
2019-03-13 14:17:27.511301_0: angry
2019-03-13 14:17:27.511301_1: others
2019-03-13 14:17:27.526898_2: angry
2019-03-13 14:17:27.526898_3: normal
2019-03-13 14:17:27.542520_4: angry
2019-03-13 14:17:27.542520_5: others
2019-03-13 14:17:27.558141_6: angry
2019-03-13 14:17:27.558141_7: others
2019-03-13 14:17:27.573762_8: angry
2019-03-13 14:17:27.573762_9: normal
2019-03-13 14:17:27.589384_10: angry
2019-03-13 14:17:27.589384_11: others
2019-03-13 14:17:27.605011_12: angry
2019-03-13 14:17:27.605011_13: others
2019-03-13 14:17:27.620631_14: angry
2019-03-13 14:17:27.620631_15: normal
2019-03-13 14:17:27.636248_16: angry
2019-03-13 14:17:27.636248_17: others
2019-03-13 14:17:27.636248_18: angry
2019-03-13 14:17:27.651869_19: others
2019-03-13 14:17:27.651869_20: angry
2019-03-13 14:17:27.667491_21: normal
2019-03-13 14:17:27.667491_22: angry
まとめ
・shutil.moveによりファイル移動を行えた
・textファイルに移動履歴の記録ができるようになった