如何编写高质量的程序呢? 在《Web服务端软件的的服务品质概要》阐述了程序的常见质量属性及实现策略方法,本文将通过一个 Python 实现的图片文件批量重命名工具来演示如何逐步提升程序质量。
图片文件批量重命名工具实现的功能是:将指定目录 /home/user/path/to/photos/(xxx.png,yyy.png) 下的图片批量重命名为 prefix0001.png, prefix0002.png, …
雏形
首先,可以编写出一个基本可用的程序 batchrename_basic.py 。这个程序并不完美,但是可以完成最初的任务。注意到 生成编号使用了闭包,这是为了将生成编号的过程抽离出来成为一个可复用的过程,而这个过程无法预知需要生成怎样的列表,因此每次仅返回一个编号;程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# -*- coding: cp936 -*- import os import os.path as PathUtil def createDesignator(num, bits): return str(num).zfill(bits) def number_generator(start_num=0, bits=4): start = [] start.append(start_num) def inner(): start[0] = start[0] + 1 return createDesignator(start[0], bits) return inner def batchrename(dir_path, prefix="IMG_",generator_func=number_generator()): ''' rename files (such as xxx.[jpg, png, etc]) in the directory specified by dir_path to [prefix][designator].[jpg, png, etc], designator is generated by generator_func ''' names = os.listdir(dir_path) for filename in names: old_filename = PathUtil.join(dir_path,filename) if PathUtil.isfile(old_filename)==True: newname=prefix.upper() + generator_func() + '.' + getFileSuffix(filename) os.rename(old_filename,PathUtil.join(dir_path,newname)) def getFileSuffix(filename): try: sep_ind = filename.index('.') return filename[sep_ind+1:] except ValueError: return None def testGetFileSuffix(): assert getFileSuffix("good.jpg") == "jpg" assert getFileSuffix("good") is None print "testGetFileSuffix Passed." def testNumberGenerator(): geneNums = [] generator = number_generator() for i in range(10): geneNums.append(generator()) assert geneNums[0] == '0001' assert geneNums[1] == '0002' assert geneNums[9] == '0010' print 'testNumberGenerator Passed.' if __name__ == '__main__': testGetFileSuffix() testNumberGenerator() dir_path = '/home/lovesqcc/setupdir/scitools/pic/mmnet/beauty' batchrename(dir_path, prefix="beauty_") |
健壮性
健壮性体现了程序应对错误的能力。一个需要网络连接的 APP 在网络正常的情况下运行流畅,如果没有网络呢? 就必须告知用户先连接到网络才行。或者采用输入自动纠错。比如在搜索引擎里搜索 jquery, 不小心写成了 jqeury 。搜索引擎会提示是否需要搜索的是 jquery。在此例中,当路径不存在时,就会报错。
1 2 3 4 5 6 |
Traceback (most recent call last): File "batchrename_robust.py", line 57, in batchrename(dir_path, prefix="beauty_") File "batchrename_robust.py", line 21, in batchrename names = os.listdir(dir_path) OSError:n-h"> = os.listdir(dir_path) OSError:步提升程序质量。
图片文件批量重命名工具实现的功能是:将指定目录 /home/user/path/to/photos/(xxx.png,yyy.png) 下的图片批量重命名为 prefix0001.png, prefix0002.png, …
雏形 首先,可以编写出一个基本可用的程序 batchrename_basic.py 。这个程序并不完美,但是可以完成最初的任务。注意到 生成编号使用了闭包,这是为了将生成编号的过程抽离出来成为一个可复用的过程,而这个过程无法预知需要生成怎样的列表,因此每次仅返回一个编号;程序如下:
健壮性 健壮性体现了程序应对错误的能力。一个需要网络连接的 APP 在网络正常的情况下运行流畅,如果没有网络呢? 就必须告知用户先连接到网络才行。或者采用输入自动纠错。比如在搜索引擎里搜索 jquery, 不小心写成了 jqeury 。搜索引擎会提示是否需要搜索的是 jquery。在此例中,当路径不存在时,就会报错。
|