- 論壇徽章:
- 11
|
本帖最后由 timespace 于 2014-01-17 10:46 編輯
回復 1# liaozd
主要功能OK,代碼的注釋和文檔說明了實現(xiàn)細節(jié)。另外,在程序正確運行之前,過早優(yōu)化性能是多余且有害的。
在safari/chrome里,CU的代碼標簽有問題,代碼以我附件內(nèi)容為準。- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import itertools
- import os
- import re
- import sys
- from os.path import getsize, isdir, isfile, join, splitext
- class KeyTracker(object):
- """有狀態(tài)的KEY生成器。
-
- 給定一個KEY,保存對應一組序列中的兩個字段:
- -- 第一個記錄
- -- 當前迭代的上一個記錄
- """
- def __init__(self):
- self.start = self.prev = None
- def key(self, e):
- if self.prev is not None and \
- self.prev[1] == e[1] and \
- self.prev[2] == e[2] and \
- self.prev[3] is not None and \
- int(self.prev[3]) + 1 == int(e[3]):
- self.prev = e
- return self.start[1:]
- else:
- self.start = self.prev = e
- return e[1:]
- def main():
- if len(sys.argv) != 2 or not isdir(sys.argv[1]):
- sys.exit(sys.argv[0] + ' target_dir')
- target = sys.argv[1]
- # alphanum = ...... 這行內(nèi)容與CU的代碼標簽沖突,以附件內(nèi)容為準。
- for root, dirs, files in os.walk(target):
- # 為了后續(xù)排序和分類方便,將文件名擴展為如下tuple數(shù)組
- # dummy_files = [(完整文件名, 擴展名, 文件名前綴,文件名數(shù)字后綴), ...]
- # 例如'name0012.jpg'會轉(zhuǎn)換為('name0012.jpg', '.jpg', 'name', '0012')
- # 例如'test.sh'會轉(zhuǎn)換為('test.sh', '.sh', 'test', None)
- dummy_files = []
- for name in files:
- prefix, ext = splitext(name)
- res = alphanum.match(prefix)
- if res is None:
- dummy_files.append(tuple([name, ext, prefix, None]))
- else:
- dummy_files.append(tuple([name, ext, res.group(1), res.group(2)]))
- # 以(擴展名, 文件名前綴,文件名數(shù)字后綴)為key進行排序,
- # 而tuple隱含的排序規(guī)則就是按字段順序優(yōu)先級遞減,正好符合需求。
- dummy_files.sort(key=lambda e: e[1:])
- # 對數(shù)組元素分類,‘文件名數(shù)字后綴’連續(xù)的文件需合并, 是一個有狀態(tài)key,
- # 此處groupby的key隱含的排序穩(wěn)定性必須與上述的sort一致。
- groupkey = KeyTracker()
- for k,g in itertools.groupby(dummy_files, key=groupkey.key):
- total_size = 0
- for idx, item in enumerate(g):
- filename = join(root, item[0])
- if isfile(filename):
- total_size += getsize(filename)
- name = item[0] if idx == 0 else '{}{}-{}{}'.format(k[1], k[2], item[3], k[0])
- print '{}: {}, {} bytes'.format(root, name, total_size)
- if __name__ == '__main__':
- main()
-
復制代碼 保存為test.py,運行:- bash-3.2 $python --version
- Python 2.7.5
- bash-3.2 $./test.py folder1/
- folder1/: name01-02.jpg, 69 bytes
- folder1/: name01-02.tif, 16 bytes
- folder1/: name10-12.tif, 36 bytes
- folder1/: file.txt, 16 bytes
復制代碼 |
-
-
test.py.gz
2014-01-17 10:34 上傳
點擊文件名下載附件
1.23 KB, 下載次數(shù): 1763
|