- 论坛徽章:
- 11
|
本帖最后由 timespace 于 2014-01-17 10:46 编辑
回复 1# liaozd
主要功能OK,代码的注释和文档说明了实现细节。另外,在程序正确运行之前,过早优化性能是多余且有害的。
在safari/chrome里,CU的代码标签有问题,代码以我附件内容为准。- #!/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):
- """有状态的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 = ...... 这行内容与CU的代码标签冲突,以附件内容为准。
- for root, dirs, files in os.walk(target):
- # 为了后续排序和分类方便,将文件名扩展为如下tuple数组
- # dummy_files = [(完整文件名, 扩展名, 文件名前缀,文件名数字后缀), ...]
- # 例如'name0012.jpg'会转换为('name0012.jpg', '.jpg', 'name', '0012')
- # 例如'test.sh'会转换为('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)]))
- # 以(扩展名, 文件名前缀,文件名数字后缀)为key进行排序,
- # 而tuple隐含的排序规则就是按字段顺序优先级递减,正好符合需求。
- dummy_files.sort(key=lambda e: e[1:])
- # 对数组元素分类,‘文件名数字后缀’连续的文件需合并, 是一个有状态key,
- # 此处groupby的key隐含的排序稳定性必须与上述的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
复制代码 |
|