[python] Blu-ray Disc一杯に書きこみたい

NO IMAGE

最近、pythonの勉強をしたのでコードを書いてみた。
ちょっと会社で時間ができたから、pythonの本を読んでみてる

BDディスク一杯に書き込むために、フォルダ内からディスク容量一杯になるファイルとフォルダの組み合わせを見つける
Disc容量を一杯にする方法
・対象のファイルとフォルダは深さ0で、フォルダ内のファイルは一塊
・更新日時が古いファイルとフォルダから、容量が許すまで選択する
・上記選択での残り容量に入るファイルとフォルダの組み合わせを見つける
普段バックアップファイルを選択する手順をpythonコードにしてみた感じ
もっと頭のいい方法、アルゴリズムがあったら教えて欲しい[:パー:]
bd_backup.py

#!/usr/bin/python
#vim: fileencoding=utf-8
import os,sys
max_size = 25000000000 #byte
max_combination = 5
class Bd(object):
def __init__(self, target, max_size):
self.folder = target
self.max_size = max_size
self.BackupList = []
def _getFolderSize(self, sInFdr):
size=0
for root,dirs,files in os.walk(sInFdr):
for f in files:
size+=os.path.getsize(os.path.join(root,f))
return size
def _sort_date(self, file_stat):
return file_stat['date']
def _getDirList(self):
listdir = []
for name in os.listdir(self.folder):
tmp = {}
fullpath = os.path.join(self.folder,name)
if os.path.isdir(fullpath):
tmp['size'] = self._getFolderSize(fullpath)
tmp['name'] = fullpath + '/'
else:
tmp['size'] = os.path.getsize(fullpath)
tmp['name'] = fullpath
tmp['date'] = os.stat(fullpath).st_mtime
listdir.append(tmp)
listdir.sort(key=self._sort_date)
return listdir[:]
def _getRemainderList(self, rsize, listdir, max_comb):
import itertools
for fdata in listdir:
if fdata['size'] > rsize:
listdir.remove(fdata)
comb = ()
for num in range(max_comb+1):
diff = rsize
for c in itertools.combinations(listdir,num):
val = 0
for d in c: val+=d['size']
if val < rsize and rsize-val < diff:
diff = rsize-val
comb = c
return list(comb)
def getBackupList(self):
listdir = self._getDirList()
total_size=0
for fdata in listdir[:]:
if total_size+fdata['size'] < self.max_size:
total_size += fdata['size']
listdir.remove(fdata)
self.BackupList.append(fdata)
else:
break
if listdir != []:
rlist = self._getRemainderList(self.max_size-total_size, listdir, max_combination)
self.BackupList += rlist
return self.BackupList
if __name__ == '__main__':
if len(sys.argv) !=2:
print 'Usage: %s backup_folder' % sys.argv[0]
quit()
bd = Bd(sys.argv[1],max_size)
for a in bd.getBackupList():
sys.stdout.write(a['name']+'\n')

バックアップするフォルダを引数にして実行すると、バックアップすべきファイルとフォルダが表示される

>python bd_backup.py /backup_folder

自分の使い方は
最後の行の

sys.stdout.write(a['name']+'\n')
↓
sys.stdout.write(a['name']+'\0')

にしてファイル名の空白に対応

>python bd_backup.py /backup_folder | xargs -0 mv -t /backup_temp

バックアップのテンポラリフォルダに移して、ライティングソフトに持っていく、焼き終わったそのフォルダごと削除
まだわかってないところがあると思うけど、とりあえず動くものはできた
書いてみて、ライン数が思ったより少なくて、C++erの自分としては驚いた、さすが流行りの言語だ[:にわとり:]